C# 使用C进行异步或批处理#

C# 使用C进行异步或批处理#,c#,asp.net,.net,asynchronous,C#,Asp.net,.net,Asynchronous,我有一个C#中的.Net应用程序,需要一些异步处理。用户将从aspx页面上载一个人员记录文件,系统应上载该文件,解析该文件,将人员加载到数据库中,然后将该文件移出其上载到的初始目录 我不希望用户必须等待,因为有些文件可能有数千条记录,系统可能需要一段时间来检查所有记录。我基本上想返回一条信息,上面写着:“谢谢你上传你的文件。系统将处理它,并在完成后向你发送电子邮件。” 我已经读过关于新的async/await关键字的文章,但我不确定这是否是我应该采取的方法。我基本上只需要一个按钮事件处理程序来上

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

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

我已经读过关于新的async/await关键字的文章,但我不确定这是否是我应该采取的方法。我基本上只需要一个按钮事件处理程序来上传文件,并启动一个“批处理”过程来完成文件处理,同时在UI上将控制权返回给用户,让用户在站点上做任何他/她想做的事情

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


有没有更好的方法或模式可以使用,或者异步/等待就足够了?

您可以使用异步页面-基于

链接:

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

await
在GUI应用程序中的按钮事件处理程序方法中使用时,不会向消息循环屈服

是否有更好的方法或模式可以用于此,或者async/Wait是否足够

async
/
await
不会执行此操作,因为-您的
await
只会让位于ASP.NET线程池(而不是用户的浏览器)

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


然后你就可以有一个Win32服务或其他东西来监控这个目录,处理文件,发送电子邮件。请注意,如果计划将Azure Blob/Queues部署到云,则应使用Azure Blob/Queues,而不是文件系统。

如果您习惯使用ASP.NET/ThreadPool处理文件解析/数据库工作/电子邮件通知,则可以使用HttpModule/计时器实现此功能。使用ASP.NET上载文件和HttpModule,以监视文件系统中的新上载并处理文件,或者在上载文件时添加数据库记录,并定期轮询数据库中的新记录

这会让你走,也会概述你使用这种方法可能面临的问题

如果您需要更复杂的内容,或者您的站点有很多流量,您最好使用单独的进程(windows服务或计划任务)进行批处理


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

Task.Factory.StartNew(()=>{UploadFile(…);})我最后做了类似的事情。在将文件上传到文件系统后,我使用任务库生成了一个单独的线程。该任务将文件记录加载到DB表中,然后适当地处理每条记录。我需要更多地关注Azure(这是我希望最终为我的应用程序做的事情,并将整个事情移植到云上)。谢谢你的帮助!