首页 新闻 会员 周边 捐助

asp.net web api接口被请求后,立即响应200,具体业务在接口中新开线程处理

0
悬赏园豆:10 [已解决问题] 解决于 2019-10-12 08:59

接口被请求后,立即响应200,具体业务在接口中新开线程处理。

目前是这么做的,也没啥问题。

后来试着用async/task/await改造,但发现无法实现这个效果。因为使用await [具体task]后,虽然主线程被释放了,但是task所在的线程却阻塞了整个流程。说好的异步呢?

不知道我理解的对不对?

    [Route("api/values/getAsync")]
    public async Task<string> GetAsync(int sleepTime)
    {
        var info = string.Format("GetAsync线程:{0}", Thread.CurrentThread.ManagedThreadId);
        var infoTask = await TaskCaller(sleepTime);
        var infoTaskFinished = string.Format("GetAsync线程:{0}", Thread.CurrentThread.ManagedThreadId);
        return string.Format("{0}______{1}______{2}", info, infoTask, infoTaskFinished);
    }

    private async Task<string> TaskCaller(int sleepTime)
    {
        await Task.Delay(sleepTime);
        return string.Format("TaskCaller线程:{0}", Thread.CurrentThread.ManagedThreadId);
    }
屌丝大叔的笔记的主页 屌丝大叔的笔记 | 初学一级 | 园豆:2
提问于:2018-10-13 16:23
< >
分享
最佳答案
0

我的理解是,await可以继续往下走不会阻塞主线程。但是你有返回值,而且用到了返回值,在用到infoTask的代码处,会等待异步线程执行完毕返回才可以继续

收获园豆:10
去海边生活 | 初学一级 |园豆:66 | 2018-10-16 10:25
其他回答(2)
0

新开线程要用 Task.Run

dudu | 园豆:29568 (高人七级) | 2018-10-13 16:34

或者试试去掉 await TaskCaller(sleepTime) 中的 await

支持(0) 反对(2) dudu | 园豆:29568 (高人七级) | 2018-10-13 17:42
0

你就在当前线程睡觉.为什么他要不卡在那里?

吴瑞祥 | 园豆:29449 (高人七级) | 2018-10-13 19:12
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册