【问题标题】:Asynchronous or batch processing with C#使用 C# 进行异步或批处理
【发布时间】:2012-09-11 17:56:50
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • Task.Factory.StartNew(() => { UploadFile(...); });

标签: c# asp.net .net asynchronous


【解决方案1】:

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

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

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

async/await 不会这样做,因为async doesn't change the HTTP protocol - 你的await 只会让步给 ASP.NET 线程池(而不是让给用户的浏览器)。

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

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

【讨论】:

  • 我最终做了类似的事情。将文件上传到文件系统后,我使用任务库生成了一个单独的线程。任务将文件记录加载到数据库表中,然后适当地处理每条记录。我需要更多地研究 Azure(这是我最终希望为我的应用程序做的事情,并将整个事情移植到云中)。感谢您的帮助!
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    This article 将助您一臂之力,并概述您使用此方法可能面临的问题。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多