我遇到的情况是,我需要为每个 任务 运行一个独占单例。目前我使用 [ThreadStatic] 属性来分别保存每个线程的单例实例。但是:我能指望不止一个任务永远不会同时在同一个线程中运行吗? ...否则我的单身人士将在这些任务之间分享。
答案 0 :(得分:1)
我假设你在谈论CPU绑定任务,例如Task.Run
等同。
TPL可以在各种情况下内联任务。这可能导致多个任务在同一个线程和堆栈上。例如,Task.Wait
可以运行任务参数,如果它尚未启动且调度程序允许它。
TPL绝对充满了这样的重入,其中Task.Wait
或TaskCompletionSource.SetResult
等看似无害的调用可以运行任意代码。在我看来,这是一个非常讨厌的设计错误。它引发了许多实际问题。我有时会阅读coreclr / corefx提交日志,并且我经常发现错误修复因TPL重入导致的问题。