2

我正在尝试在System.Threading.Tasks.Task课堂上完成一些异步工作。场景很简单。我有一个网络应用程序,在一个按钮单击事件中,我启动了一个任务,该任务必须运行几分钟来检查一些外部服务。这不是一项繁重的任务。它所要做的就是每 5 秒发送一次请求并获得响应。但它必须至少持续几分钟。所以,我不希望用户等到这个任务完成。在我开始任务后,我立即回复用户说任务已开始,完成后会通知他/她。我想知道我创建的这个任务是否会导致任何问题,因为我返回并结束了 HTTP 响应。

4

4 回答 4

4

这种类型的“异步工作”是不可能通过使用Task类型来实现的。正如我在博客中提到的,async不会更改 HTTP 协议;每个请求您仍然会得到一个响应,就是这样!

理想的 ASP.NET 应用程序不会在请求/响应对之外执行任何工作。有一些方法可以使它工作(也在我的博客中描述),但几乎从不推荐。

正确的解决方案是拆分处理。网站(或服务)应通过将请求放入持久存储(例如,Azure 队列)来开始处理,单独的工作服务(例如,Azure 工作角色/Win32 服务)将进行轮询并将结果放入持久存储(例如,Azure 表),并且网站/服务可以轮询它。

于 2013-04-15T15:47:35.650 回答
0

您可以考虑使用基于消息的服务总线,关于 MSDN使用 NHibernate 和 Rhino 服务总线构建分布式应用程序的一个很好的教程将非常有用。

于 2013-04-15T15:09:26.760 回答
0

如果您只是从标准的 asp.net 请求返回,那么您不会期望 HttpResponse 结束吗?启动任务本身不会保持 HttpResponse 打开,您需要流式传输响应并在服务器上阻塞,直到您的任务完成,这可能不是您想要做的?

也许您应该查看客户端上的一些 ajax,这些 ajax 会定期 ping 服务器以查看任务是否已完成,或者如果您知道您的浏览器将支持它,请查看 HTML 5 推送通知。

于 2013-04-15T15:12:22.483 回答
0

您可以使用此http://www.asp.net/web-forms/tutorials/aspnet-45/using-asynchronous-methods-in-aspnet-45但恕我直言 ajax 与 Web 服务要好得多

于 2013-04-15T15:12:49.763 回答