首页 新闻 会员 周边 捐助

async/await如何不让主线程挂起等待

0
[待解决问题]

protected async void MethodAsync()
{
await Task.Run(() =>
{
Thread.Sleep(15000);//当这里阻塞时,主线程挂起等待
});
}

public ActionResult Test()
{
MethodAsync();//这个方法主线程不关心它的执行结果,也就是不需要他的返回值,比如写日志操作等
return View();//如何使主线程直接返回View给客户端,而不用等阻塞结束后才返回
}

ludi的主页 ludi | 初学一级 | 园豆:5
提问于:2018-01-10 16:11
< >
分享
所有回答(4)
0

没有 await MethodAsync(); ,本来就不会阻塞,用上面的代码测试也是如此

dudu | 园豆:30948 (高人七级) | 2018-01-10 17:11

用上面的代码跑了会等待15S才返回结果给浏览器呢,主要是await Task.Run这句等待了

支持(0) 反对(0) ludi | 园豆:5 (初学一级) | 2018-01-10 17:36

@ludi: 我是用asp.net core跑的,等会我用asp.net试试

支持(0) 反对(0) dudu | 园豆:30948 (高人七级) | 2018-01-10 17:38

@ludi: 在.net framework中要改为下面的代码

public async Task<ActionResult> Index()
{
    MethodAsync();//这个方法主线程不关心它的执行结果,也就是不需要他的返回值,比如写日志操作等
    return View();//如何使主线程直接返回View给客户端,而不用等阻塞结束后才返回
}

protected async Task MethodAsync()
{
    await Task.Run(() =>
    {
        Thread.Sleep(15000);//当这里阻塞时,主线程挂起等待
    });
}
支持(0) 反对(0) dudu | 园豆:30948 (高人七级) | 2018-01-10 18:15
0

在MethodAsync 使用await关键词。就如你上面的代码,Thread.Sleep(15000) 主线程不会被挂起,执行到await Task.Run() 就直接异步返回了。

博客园团队 | 园豆:5379 (大侠五级) | 2018-01-10 17:38

如果这句async void MethodAsync()这样写前端要等15S才能返回结果,但是改成async Task MethodAsync()就不用等待了,但是VS提示这样不符合规范,有波浪线

支持(0) 反对(0) ludi | 园豆:5 (初学一级) | 2018-01-10 17:41
0

异步等待一般用Task.Delay,async Task MethodAsync() 这个才是规范的写法,有波浪线只是VS提示你没有await而已,这个你不用管

梦里的畅泳 | 园豆:159 (初学一级) | 2018-01-10 17:50
0

不是异步action 就会等待。 异步action不会等待15s,但方法也不会立即返回。

HarrisonWu | 园豆:229 (菜鸟二级) | 2018-06-26 17:36
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册