我有一个 ASP.NET Web API 控制器,我认为它会异步操作。控制器设计为第一个请求休眠 20 秒,但立即为任何后续请求提供服务。所以我预期的时间表是这样的:
- 提出请求 1。
- 提出请求 2。
- 提出要求 3。
- 请求 2 返回。
- 请求 3 返回。
- 等待约 20 秒。
- 请求 1 返回。
相反,在请求 1 完成之前没有请求返回。
我可以确认(基于调试输出),入口线程和休眠线程 id 是不同的。我故意TaskCreationOptions.LongRunning
将睡眠强制到一个单独的线程上,但应用程序仍然拒绝为任何新请求提供服务,直到睡眠完成。
我是否遗漏了有关异步 Web API 控制器如何真正工作的基本知识?
public class ValuesController : ApiController
{
private static bool _firstTime = true;
public async Task<string> Get()
{
Debug.WriteLine("Entry thread id: {0}. Sync: {1}",
Thread.CurrentThread.ManagedThreadId,
SynchronizationContext.Current);
await LongWaitAsync();
return "FOOBAR";
}
private Task LongWaitAsync()
{
return Task.Factory.StartNew(() =>
{
if (_firstTime)
{
_firstTime = false;
Debug.WriteLine("Sleepy thread id: {0}. Sync: {1}",
Thread.CurrentThread.ManagedThreadId,
SynchronizationContext.Current);
Thread.Sleep(20000);
Debug.WriteLine("Finished sleeping");
}
},
CancellationToken.None,
TaskCreationOptions.LongRunning,
TaskScheduler.Default);
}
}