Async / Await vs TPL vs WCF Service vs Web API:有很多选择

时间:2014-05-29 16:15:46

标签: asp.net wcf asp.net-web-api task-parallel-library async-await

我的ASP.Net 4网络应用程序调用了一些代码,这些代码为长时间运行的脚本生成了一个进程。读取标准输出,并在数据库中更新返回值。我想“发射并忘记”这段代码,以便我的UI保持响应,用户不必等待这两个操作完成。调用代码不需要这两个操作的最终结果,所以我认为我不需要“等待”任何事情,我不需要任何成功或失败的迹象。

我对所有可用选项感到困惑。编码这个的最佳方法是什么,以便这两个操作只是以他们的快乐方式发送并自己做他们的事情?

3 个答案:

答案 0 :(得分:2)

嗯,“最佳方式”可能有争议,但我会使用以下内容继续TPL

Task parentTask = Task.Factory.StartNew(() => SomeMethod(someParameter));

注意:如果“长时间运行的脚本”调用WCF服务,那么有关WCF异步编程的以下文章可能会有所帮助。 http://blogs.msdn.com/b/wenlong/archive/2009/02/09/scale-wcf-application-better-with-asynchronous-programming.aspx

答案 1 :(得分:2)

我认为你的条款混杂了。

WCF Web API 是两个服务平台,可让您通过服务远程启用您的操作。

使用这两种技术,这些公开的操作可以同步或异步实现,但即使您选择异步实现它们,对这些操作的调用也可能具有显着的延迟,因此应该异步调用。

为了从ASP.NET网站执行调用这些服务操作,您可以使用库,例如TPL ,它可以为您提供异步Tasksasyncawait只是C#关键字,可以轻松处理此类任务。

您可以使用其他库和实现(如线程)来执行调用而不会阻止您的Web,而不是TPL,但是现在在.NET中,任务是首选方式。

如果您不太可能从不同的应用程序和长时间运行的过程重用,或者不需要位于不同的计算机上,您也可以直接将其作为任务实施,而不是通过所有实施服务的麻烦。

答案 2 :(得分:2)

  

我想“发射并忘记”这段代码

“Fire and forget”在ASP.NET上几乎总是错误的解决方案。

  

以便我的用户界面保持响应

您可以在不更改服务器端的情况下使用户界面响应。只需异步执行请求(HttpClient用于.NET UI; AJAX用于HTML用户界面。)

  

我不需要任何成功或失败的迹象。

自从?这是我们通常发现“火与忘记”实际上不是人们想要的东西。一个真正的“火与忘记”意味着如果后台操作永远不会完成或有错误,那么你完全没有任何东西出现在日志中。

正如我上面所说,最好的选择是在客户端处理“异步”需求。但是如果你真的需要在服务器上进行,那么你有三个选择:

  1. 添加具有独立后端的持久队列(例如,Azure队列和Azure WebJob)。您的Web应用程序只是将工作添加到队列并返回。独立后端从队列中读取并进行实际处理。
  2. 使用HangFire之类的内容。这基本上是相同的,除了“队列”是一个数据库,后端与ASP.NET应用程序一起运行,而不是完全独立。
  3. 使用类似HostingEnvironment.QueueBackgroundWorkItem(.NET 4.5.2)或AspNetBackgroundTasks(.NET 4.5)的内容。这是一个更危险的选择,因为没有可靠的存储空间。
相关问题