【发布时间】:2011-04-29 01:11:10
【问题描述】:
我们的系统会在写入的每条消息中写入 ManagedThreadID,多年来我们一直使用它来帮助区分日志中的多个特定工作单元。到目前为止,一切顺利。
现在,我们开始使用任务并行库并注意到一个有趣的效果:
public static void Main(string[] args) {
WriteLine("BEGIN");
Parallel.For(0, 32, (index) => {
WriteLine(" Loop " + index.ToString());
});
WriteLine("END");
}
输出类似于:
ThreadID=1, Message=BEGIN
ThreadID=1, Message= Loop 0
ThreadID=3, Message= Loop 16
ThreadID=3, Message= Loop 17
...
ThreadID=4, Message= Loop 4
ThreadID=4, Message= Loop 5
ThreadID=1, Message= Loop 8
ThreadID=1, Message= Loop 9
ThreadID=1, Message= Loop 10
ThreadID=3, Message= Loop 21
ThreadID=4, Message= Loop 6
...
ThreadID=3, Message= Loop 24
ThreadID=3, Message= Loop 25
ThreadID=1, Message= Loop 11
ThreadID=1, Message= Loop 12
ThreadID=1, Message= Loop 13
ThreadID=1, Message= Loop 31
ThreadID=3, Message= Loop 26
...
ThreadID=3, Message= Loop 30
ThreadID=1, Message=END
您会注意到主线程的 ThreadID(标记为“BEGIN”)有时会在 Loop 线程中回收。
我的问题是:这是否会发生在其他任何地方——例如线程池或使用任务并行库的其他功能时?我花了很多时间试图找出引发这种行为的其他方法,但我做不到。
这里的问题是,如果我们不能再依赖 ThreadID(我们有很多工具可以依赖这种行为),那么我们将避免使用 Parallel.For。但如果问题会以其他方式表现出来,我们需要弄清楚如何避免它们直到我们改进我们的日志记录策略和工具支持。
如果有其他方法可以引发该行为,我想了解一下,以便确定我们的任何用法是否符合此类条件,以便我们进行相应的纠正。更重要的是,我可以获得一个示例程序来激发行为并研究我们工具中的任何副作用。
【问题讨论】:
标签: multithreading .net-4.0 task-parallel-library