2

我在 C# 中有一个 .Net 应用程序,我需要一些异步处理。用户将从 aspx 页面上传 PEOPLE 记录文件,系统应上传文件、解析文件、加载数据库中的人员,然后将文件移出上传到的初始目录。

我不希望用户必须等待,因为某些文件可能有数千条记录,系统可能需要一段时间才能完成所有记录。我基本上想返回一条消息,“感谢您上传文件。系统将处理它并在完成后向您发送电子邮件”。

我已经阅读了新的 async/await 关键字,但我不确定这是否是我应该采取的路线。我基本上只需要一个按钮事件处理程序来上传文件并启动一个“批处理”过程来完成对文件的处理,同时在 UI 上将控制权返回给用户以执行他/她想要在网站上执行的任何其他操作。

我想第二个问题是:在按钮事件处理程序方法中使用时,等待是否将控制权返回给用户?如果是这样,那么这对我来说似乎是一个完美的解决方案,因为它不会阻塞线程或用户。

我应该为此使用更好的方法或模式,还是 async/await 就足够了?

4

3 回答 3

2

我想第二个问题是:在按钮事件处理程序方法中使用时,等待是否将控制权返回给用户?如果是这样,那么这对我来说似乎是一个完美的解决方案,因为它不会阻塞线程或用户。

await在 GUI 应用程序的按钮事件处理程序方法中使用时,确实会产生消息循环。

我应该为此使用更好的方法或模式,还是 async/await 就足够了?

async/await不会这样做,因为async不会更改 HTTP 协议- 您await只会屈服于 ASP.NET 线程池(而不是用户的浏览器)。

解决此问题的最佳方法是让您的 ASP.NET 页面将文件写入磁盘(如果可能,异步),然后返回响应“我们将在完成后通过电子邮件发送给您”。

然后,您可以拥有一个 Win32 服务或监视该目录、处理文件和发送电子邮件的东西。请注意,如果您计划将其部署到云中,则应使用 Azure Blobs/Queues 而不是文件系统。

于 2012-09-11T18:58:03.217 回答
1

您可以使用异步页面 - 基于<%@ Page Async="true" ... %>

链接:http: //msdn.microsoft.com/en-us/magazine/cc163725.aspx

于 2012-09-11T18:01:35.997 回答
0

如果您对使用 ASP.NET/ThreadPool 处理文件解析/数据库工作/电子邮件通知感到满意,您可以使用 HttpModule/Timer 来实现它。使用 ASP.NET 上传文件,并使用 HttpModule 监视文件系统是否有新的上传并处理文件,或者在文件上传时添加数据库记录并定期轮询数据库以获取新记录。

本文将助您一臂之力,并概述使用此方法可能遇到的问题。

如果您需要更复杂的东西或者您的网站有大量流量,您最好使用单独的进程(Windows 服务或计划任务)进行批处理。

如果您需要我可以发布的任何示例代码,但目前使用的是 .NET 3.5 而不是 4.0。

于 2012-09-12T03:12:43.917 回答