2017-09-25 107 views
0

NewbieQ:想知道C#异步/等待服务器端异步最佳实践

我有现在的时间过长,完成导致超时错误的服务器端AJAX请求处理。

处理程序调用一个方法:

public bool Run(Guid jobId) // returns true if successful in running jobId 

运行作业交替IO那么势必CPU绑定操作的顺序,在重要的情况下。

理想情况下,我希望能够启动运行,然后不时地查询运行状态,然后得到结果(运行返回的布尔值)。

当编写服务器端代码来执行此操作时,最佳做法是什么?

我可以像这样写一个包装吗?

public async Task<bool> RunAsync(Guid jobId) {...} 

如果是这样,那怎么称为非异步运行?

或者我需要做一个完整的重新编写的运行方法?最终,我从ajax请求处理程序调用此方法,所以我需要返回作业结果,或者我可以更改请求,然后启动作业,然后不时查询具有{bool resultReady,布尔?结果}或者像这样的结构。

+0

如果您有多个可以并行运行的进程,async/await会很有帮助。如果这是一个正在运行并超时的单个进程,那么异步/等待将不会对您有所帮助。听起来更像是你应该有另一个进程,比如控制台应用程序,它接收到一个通知来开始这项工作。控制台应用程序不会像Web请求那样超时,但您必须轮询结果。或者,您可以考虑增加IIS/ASP.NET超时之前的时间.https://stackoverflow.com/questions/2414441/how-to-increase-request-timeout-in-iis。 – ps2goat

+0

了解,但是这是运行在一个Web服务上,其他用户有其他事情要做,甚至要求这个任务的用户可能希望在等待结果时做其他事情。我真正担心的是,Web服务本身正在等待任务完成为同步任务。 –

+0

@ ps2goat这是不正确的。 await对管理异步操作很有用。这些操作是否并行工作并不重要。 – Servy

回答

1

你真正想要的是不是可以用简单的单一方法完成的事情。您真的需要一个排队系统,您可以在队列中检查给定消息的状态。你基本上有一种方法可以将某些东西放入队列(如MSMQ),另一种方法可以返回给定的状态jobId

1

您可以看看hangfire或signalR长时间运行的过程可能发生与事件处理程序通知客户端。