接口被请求后,立即响应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);
}
我的理解是,await可以继续往下走不会阻塞主线程。但是你有返回值,而且用到了返回值,在用到infoTask的代码处,会等待异步线程执行完毕返回才可以继续
新开线程要用 Task.Run
或者试试去掉 await TaskCaller(sleepTime)
中的 await
你就在当前线程睡觉.为什么他要不卡在那里?