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

2019-10-12 08:01发布

接口被请求后,立即响应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);
    }

3条回答
干净又极端
2楼-- · 2019-10-12 08:34

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

查看更多
Luminary・发光体
3楼-- · 2019-10-12 08:46

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

查看更多
啃猪蹄的小仙女
4楼-- · 2019-10-12 08:55

新开线程要用 Task.Run

查看更多
登录 后发表回答