【发布时间】:2012-05-31 11:29:12
【问题描述】:
我有这个简单的代码:(我在 linqpad 中运行)
void Main()
{
for ( int i=0;i<10;i++)
{
int tmp=i;
new Thread (() =>doWork(tmp)).Start();
}
}
public void doWork( int h)
{
h.Dump();
}
int tmp=i; 行用于捕获变量 - 因此每次迭代都有自己的值。
2 个问题:
1)数字是不顺序的,而线程执行是!
2) 有时我得到的数字少于 10 个!
这里有一些执行输出:
问题:
1) 为什么会发生案例 1,我该如何解决?
2) 为什么会发生案例 2,我该如何解决?
【问题讨论】:
-
2 很简单——在程序完成所有需要完成的工作之前不要终止程序。 (从
main返回会终止您的程序。)我不关注您对 1 的问题——您的代码中没有任何努力使它们连续,如果您希望它们是连续的,为什么要将它们分派给线程? -
@DavidSchwartz 是的.... 1 呢?
-
如果要按顺序执行任务,为什么要分派到不同的线程?!
-
1 也很简单:线程启动缓慢,延迟不可预知,因此它们的实际启动顺序未定义。您必须等待第 (i-1) 个线程完成,然后才能开始第 n 个线程的工作——但这违背了多线程的全部目的
-
使用线程获得并发的要点,我认为如果你想获得顺序输出,你不应该在你的任务中使用线程。但是,如果您需要在此任务中使用线程连续输出,请使用 Join() : var t = new Thread (() =>doWork(tmp)).Start(); t.Join();
标签: c# .net multithreading .net-4.0 clr