我有一个ASP.NET Web API控制器,我认为它应该是异步操作的。这个控制器设计了第一个请求睡眠20秒钟,但会立即处理任何后续请求。所以我的预期时间线应该是这样的:
1. 发出请求1。 2. 发出请求2。 3. 发出请求3。 4. 请求2返回。 5. 请求3返回。 6. 等待约20秒钟。 7. 请求1返回。
但事实上,没有请求返回直到请求1完成为止。
根据调试输出,我可以确认入口线程和休眠线程的ID是不同的。我故意使用了TaskCreationOptions.LongRunning来将休眠强制放在一个单独的线程中,但是应用程序仍然拒绝服务任何新的请求,直到该休眠完成。
我是否忽略了关于异步Web API控制器工作方式的基本知识?
1. 发出请求1。 2. 发出请求2。 3. 发出请求3。 4. 请求2返回。 5. 请求3返回。 6. 等待约20秒钟。 7. 请求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);
}
}