[英]async Controller with async Action doesn't work
我有一个具有异步操作的异步控制器。 在该操作中,我在SomeMethodOne中调用WCF服务方法(返回结果需要10秒),然后在SomeMethodTwo中执行一些数学运算(在我的计算机上执行大约6秒)。 据我了解,在等待WCF服务方法的结果期间,我的计算机应执行SomeMethodTwo,但不会,并且所有代码都将执行10秒+ 6秒= 16秒。 为什么?
public class TestController : AsyncController
{
public async Task<ActionResult> Index()
{
string result = await SomeMethodOne();
SomeMethodTwo();
return View();
}
private async Task<string> SomeMethodOne() // it needs 10 seconds to return result from WCF service
{
using (Service1Client client = new Service1Client())
{
return await client.GetDataAsync(5);
}
}
private void SomeMethodTwo() // it executes about 6 seconds on my computer
{
double result = 0;
for (int i = 0; i < 1000000000; i++)
{
result += Math.Sqrt(i);
}
}
}
我在本地运行的WCF服务:
public class Service1 : IService1
{
public string GetData(int value)
{
Thread.Sleep(10000);
return string.Format("You entered: {0}", value);
}
}
您的问题是您正在立即使用await
:
string result = await SomeMethodOne();
await
意味着您的控制器操作将在继续执行之前“异步等待”(等待) SomeMethodOne
的结果。
如果要进行异步并发,请不要立即await
。 相反,您可以通过调用方法来启动异步操作,然后再await
:
public async Task<ActionResult> Index()
{
Task<string> firstOperation = SomeMethodOne();
SomeMethodTwo();
string result = await firstOperation;
return View();
}
然后我执行[强调我的]
只要将两者加在一起, 就要做一件事然后再做另一件事。
同时执行两项操作可能会更快。 由于上下文切换,它可能会变慢(想象某人做了很多“多任务”,并且在它们之间切换的时间比工作要多)。 如果您不必为了执行第二个操作而从第一个操作中获取结果,那么在这里可能会更快一些:
public async Task<ActionResult> Index()
{
Task<string> task = SomeMethodOne();
SomeMethodTwo();
string result = await task;
return View();
}
显然,如果在调用SomeMethodTwo()
之前需要result
,那么将不可能。 await
SomeMethodOne()
(如果可能与.NET约定相适应,则应称为SomeMethodOneAsync()
仍然有一个优势,即如果GetDataAsync()
是真正异步的,则执行此操作方法的线程可以执行某些操作否则将向Web应用程序发出其他请求,并且当I / O操作返回数据时,另一个线程将继续处理该请求。 这不利于所涉及的单个方法的性能,但确实有助于针对所有Web请求在计算机上运行的所有方法的整体可伸缩性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.