【发布时间】:2013-02-06 10:31:46
【问题描述】:
我有一个 ASP.NET Web API 控制器,我会认为会异步操作。控制器设计为第一个请求休眠 20 秒,但立即处理任何后续请求。所以我预期的时间表是这样的:
- 提出请求 1。
- 提出请求 2。
- 提出请求 3。
- 请求 2 返回。
- 请求 3 返回。
- 等待约 20 秒。
- 请求 1 返回。
相反,no 请求会在请求 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);
}
}
【问题讨论】:
-
第一步,我将
_firstTime标记为volatile,以确保不同的线程可以看到它一致地变化。 -
您使用什么网络服务器来托管?
-
将
_firstTime标记为volatile没有区别。我尝试在 Win 7 Pro 上托管 IIS Express 8.0 和 IIS 7.5。 -
@Snixtor - 这可能没什么区别,但无论如何都应该这样做。
-
@Damien_The_Unbeliever 适当指出。我承认我必须查找它的含义,它肯定与我的示例代码相关。
标签: c# asp.net-web-api async-await