我在ASP.NET应用程序中有一个方法,要花大量时间才能完成。在一个用户请求期间,此方法的调用最多可能发生3次,具体取决于用户提供的缓存状态和参数。每次通话大约需要1-2秒才能完成。该方法本身是对服务的同步调用,无法覆盖实现。
因此,对该服务的同步调用如下所示:
public OutputModel Calculate(InputModel input)
{
// do some stuff
return Service.LongRunningCall(input);
}
方法的用法是(请注意,方法的调用可能会发生多次):
private void MakeRequest()
{
// a lot of other stuff: preparing requests, sending/processing other requests, etc.
var myOutput = Calculate(myInput);
// stuff again
}
我尝试从自己的角度更改实现,以提供此方法的同步工作,这就是到目前为止的内容。
public async Task<OutputModel> CalculateAsync(InputModel input)
{
return await Task.Run(() =>
{
return Calculate(input);
});
}
用法(“执行其他操作”代码的一部分与服务调用同时运行):
private async Task MakeRequest()
{
// do some stuff
var task = CalculateAsync(myInput);
// do other stuff
var myOutput = await task;
// some more stuff
}
我的问题如下。我是否使用正确的方法来加快ASP.NET应用程序的执行速度,还是在尝试异步运行同步代码时做不必要的工作?谁能解释为什么第二种方法不是ASP.NET中的一种选择(如果确实没有)?另外,如果这样的方法适用,那么如果这是我们目前可能执行的唯一调用,我是否需要异步调用该方法(我有这种情况,在等待完成时没有其他事情要做)?
网络上有关该主题的大多数文章都介绍了将async-await
方法与代码一起使用的方法,该awaitable
方法已经提供了方法,但我的情况并非如此。这里是描述我的情况的不错的文章,它没有描述并行调用的情况,但拒绝了包装同步调用的选项,但是在我看来,我的情况正是这样做的机会。
在此先感谢您的帮助和提示。
Task.Run
内容时,内容在另一个线程中运行,该线程取自线程池。然后,根本不需要将阻塞调用(例如,对服务的防雷调用)包装到Run
s中,因为它们总是每个消耗一个线程,而该线程将在方法执行期间被阻塞。在这种情况下async-await
,我剩下的唯一好处就是一次执行多个操作。请,如果我错了,请纠正我。