protected async void MethodAsync()
{
await Task.Run(() =>
{
Thread.Sleep(15000);//当这里阻塞时,主线程挂起等待
});
}
public ActionResult Test()
{
MethodAsync();//这个方法主线程不关心它的执行结果,也就是不需要他的返回值,比如写日志操作等
return View();//如何使主线程直接返回View给客户端,而不用等阻塞结束后才返回
}
没有 await MethodAsync();
,本来就不会阻塞,用上面的代码测试也是如此
用上面的代码跑了会等待15S才返回结果给浏览器呢,主要是await Task.Run这句等待了
@ludi: 我是用asp.net core跑的,等会我用asp.net试试
@ludi: 在.net framework中要改为下面的代码
public async Task<ActionResult> Index()
{
MethodAsync();//这个方法主线程不关心它的执行结果,也就是不需要他的返回值,比如写日志操作等
return View();//如何使主线程直接返回View给客户端,而不用等阻塞结束后才返回
}
protected async Task MethodAsync()
{
await Task.Run(() =>
{
Thread.Sleep(15000);//当这里阻塞时,主线程挂起等待
});
}
在MethodAsync 使用await关键词。就如你上面的代码,Thread.Sleep(15000) 主线程不会被挂起,执行到await Task.Run() 就直接异步返回了。
如果这句async void MethodAsync()这样写前端要等15S才能返回结果,但是改成async Task MethodAsync()就不用等待了,但是VS提示这样不符合规范,有波浪线
异步等待一般用Task.Delay,async Task MethodAsync() 这个才是规范的写法,有波浪线只是VS提示你没有await而已,这个你不用管
不是异步action 就会等待。 异步action不会等待15s,但方法也不会立即返回。