我想我在 TPL 中发现了一个严重的错误。我不知道。我花了很多时间挠头,无法理解这种行为。任何人都可以帮忙吗?
我的情况是:
- 我创建了一个做简单事情的任务。没有例外等等。
- 我注册了一个 ExecuteSynchronously 设置的延续。它必须在同一个线程上。
- 我在默认任务调度程序(线程池)上启动任务。开始线程继续并等待它。
- 任务开始。通过。
- 延续与任务在同一线程上开始(使先前的任务完成!)并进入无限循环。
- 等待线程没有任何反应。不想走得更远。卡住等待。我检查了调试器,任务是 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.