我有一個ASP.NET Web API控制器,我會認爲會異步操作。控制器設計爲第一次請求睡眠20秒,但立即爲後續請求提供服務。所以,我的預期時間表將是這樣的:爲什麼我的異步ASP.NET Web API控制器阻塞主線程?
- 培養要求1.
- 培養要求2
- 培養要求3
- 請求2個回報。
- 索取3個退貨。
- 等待~20秒。
- 申請1件退貨。
而是,否請求返回,直到請求1完成。
我可以確認(基於調試輸出),入口線程和睏倦線程ID是不同的。我有意使用強制睡眠到一個單獨的線程,但應用程序仍然拒絕服務任何新的請求,直到該睡眠完成。
我錯過了關於異步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,以確保單獨的線程可以看到它一致地改變。 – 2013-02-21 07:17:50
你用什麼網絡服務器來託管? – 2013-02-21 07:17:50
將'_firstTime'標記爲'volatile'沒有區別。我已經嘗試在Win 7 Pro上的IIS Express 8.0和IIS 7.5中進行託管。 – Snixtor 2013-02-21 07:20:20