【发布时间】:2011-08-01 09:45:04
【问题描述】:
如何在 TPL 任务中使用 ThreadStatic 之类的东西?我的理解(“Wrox Professional Parallel Programming with C#”,p74)是任务可以在执行期间从一个线程切换到另一个线程。
我想做什么?
我想在静态类中维护一个会话 ID,因此我不需要将此 ID 传递给我的所有方法。我的库有 login(id)、logout(id) 之类的方法以及许多对与此 ID 关联的凭据进行操作的方法。但我不想将此 id 传递给每个方法。我可以确保在不同的线程中为不同的会话调用我的库。因此,将 login() 中的 id 保存在 ThreadStatic 变量中即可。
现在我想使用由ThreadPool 为我创建的 TPL 任务。我可以将我的会话 ID 传递给任务,但是如果我将此 ID 存储在 ThreadStatic 变量中,那么如果我的任务切换线程,它将无法生存。
【问题讨论】:
-
我没有听说过实际的task 在执行期间从一个线程切换到另一个线程。您是从哪里听说这种可能性的?
-
《Wrox Professional Parallel Programming with C#》一书的第 74 页有一张图显示了工作线程之间的任务切换。
-
@Gerard:你确定这是 while execution 而不是 queue 中的一个线程的任务,然后工作窃取意味着它切换转到另一个线程执行?
-
该图清楚地显示了一个运行时间较长的任务,该任务在执行期间切换线程。我也找不到任何其他说明线程切换理论的资源。我希望这个数字是错误的,并且 startet 任务肯定附加到一个线程。
-
我同意即使有可能在线程之间迁移任务,也不太可能实现:这样做成本太高。即使是这种情况,您对在不同任务之间共享相同 ID 的想法感到满意吗?很可能,任务将在同一个线程上多路复用。您提到的解决方案(将 ID 传递给每个方法)对我来说似乎是最干净的。
标签: c# .net multithreading