我想我在TPL中發現了一個嚴重的錯誤。我不確定。我花了很多時間撓撓頭,無法理解行爲。誰能幫忙?TPL中的錯誤 - TaskContinuationOptions.ExecuteSynchronously?
什麼我的情況是:
- 我創造,做簡單的事情的任務。沒有例外等
- 我註冊了ExecuteSynchronously集的延續。它必須在同一個線程上。
- 我在默認taskscheduler(ThreadPool)上啓動任務。開始的線程繼續並等待它。
- 任務開始。通行證。
- 延續開始於與任務相同的線程(使上一個任務完成!)並進入無限循環。
- 等待線程沒有任何反應。不想走得更遠。等待。我檢查了調試器,任務是RunToCompletion。
這是我的代碼。感謝任何幫助!
// note: using new Task() and then Start() to avoid race condition dangerous
// with TaskContinuationOptions.ExecuteSynchronously flag set on continuation.
var task = new Task(() => { /* just return */ });
task.ContinueWith(
_task => { while (true) { } /* never return */ },
TaskContinuationOptions.ExecuteSynchronously);
task.Start(TaskScheduler.Default);
task.Wait(); // a thread hangs here forever even when EnterEndlessLoop is already called.
我也認爲這是一個錯誤。這裏是文檔頁面:http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskcontinuationoptions.aspx不幸的是,它並沒有對這種情況做任何說明。 – usr
您有可能擴展代碼片段,以便其他人可以複製粘貼並自行運行嗎? –
@usr - 它的確說「只有非常短的延續應該同步執行。」 :)但我確實認爲這是一個錯誤。 –