Joe*_*nez 24 asp.net-mvc asynchronous task-parallel-library
我正在寻找有关火灾最佳实践的信息并忘记asp.net mvc行动...基本上我想要一个移动客户端来打电话; 服务器启动异步任务; 然后尽快返回移动客户端.
但我想确保,假设没有异常,异步任务将成功完成.显然有几个不同的选择:
我认为任务将是这里的最佳选择,但想从SO获得想法.
编辑:根据已有的一些答案澄清:客户端不需要回复.我希望一旦服务器开始异步任务,HTTP请求就会尽快完成.我知道客户端上的异步模式,但是我想限制移动设备维持连接打开所需的时间.此外,希望避免有一个单独的进程轮询或推送消息(通过队列,总线等),因为这是过度的.我只想在数据库中记录某些内容,在IO完成之前,客户端不需要保持连接.
Jer*_*erg 18
我知道这是一个古老的问题,但这是我对这些事情的看法,因为我不同意接受的答案.
您不需要,AsyncController
因为您不想等待异步操作完成.因此,关于MVC方面的问题的答案是:无所谓.你可以用任何方式完成你的工作,只需要一个常规的旧动作来启动过程并返回你想要的任何结果.
问题的第二部分确实更具相关性.您希望确保您的异步任务不会发生任何事情,因为您已经从Web进程启动它们,假设任务本身不会抛出异常.答案取决于您的可靠性要求.
您提到您不需要单独的流程,这限制了您的选择.您的任务将与您的Web应用程序在同一个应用程序域中运行.如果有任何事情导致应用程序域或进程失效,您的任务将会死亡,可能处于一种奇怪的状态.这甚至不一定来自未处理的例外情况.可以将IIS设置为不时或在某些条件下自动回收应用程序.或者,如果您发布新代码或触摸bin目录中的任何内容,您的应用程序域将在所有请求完成后拆除,并启动新的请求.如果这些案例对你来说是一个阻碍,那么你别无选择,只能将你的任务移出进程并与某种消息传递进行通信.
如果你不担心IIS杀了你,你还是要担心自己.如果您没有最后机会处理AppDomain.UnhandledException
事件,那么来自其他后台任务的未处理异常将导致进程失效.在使用任务并行库的情况下,如果您在事件中没有最后机会观察它们,那么您没有Wait
通过它们观察或查看Result
或Exception
属性的异常将导致进程TaskScheduler.UnobservedTaskException
失效.
另外需要注意的是,用于后台操作的任何ThreadPool线程都无法在此期间为您的Web应用程序提供请求.您可以管理池中的最大线程,或者改为启动新线程.或者,如果您将TPL与默认调度程序一起使用,请使用LongRunning
提示计划任务以有效获取新线程.
Sun*_*abu 13
public async Task<ActionResult> Index()
{
// Start all operations.
var tasks = new[]
{
Task.Run(() =>TestOutput.DoWork("1")),
Task.Run(() =>TestOutput.DoWork("2")),
Task.Run(() =>TestOutput.DoWork("3"))
};
// Asynchronously wait for them all to complete.
// Uncomment below line to not forget the results
// var results = await Task.WhenAll(tasks);
// Return empty string for fire and forget.
return View(string.Empty);
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
9044 次 |
最近记录: |