ali*_*hoo 14 c# multithreading delegates
有什么区别:
new Thread(new ThreadStart(SomeFunc))
Run Code Online (Sandbox Code Playgroud)
和:
new Thread( delegate() { SomeFunc();} )
Run Code Online (Sandbox Code Playgroud)
此代码在我的计算机上提供奇怪的输出:
public class A
{
int Num;
public A(int num)
{
Num = num;
}
public void DoObj(object obj)
{
Console.Write(Num);
}
public void Do()
{
Console.Write(Num);
}
}
/////// in void main()
for (int i = 0; i < 10; i++)
{
(new Thread(new ThreadStart((new A(i)).Do))).Start(); // Line 1
(new Thread(new ThreadStart(delegate() { (new A(i)).Do(); }))).Start(); // Line 2
(new Thread(delegate() { (new A(i)).Do(); })).Start(); // Line 3
}
Run Code Online (Sandbox Code Playgroud)
如果仅执行第1行,则输出类似于:
0 2 3 1 5 6 4 7 8 9
这是好的,但如果执行第2行或第3行,则输出为:
3 3 3 5 5 7 7 9 9 10
有一些多个数字和一个10很奇怪,循环永远不会以数字10运行.这些背后的诀窍是什么?
谢谢.
Pie*_*kel 15
有了代表,你正在捕捉i.
不同之处在于new ThreadStart((new A(i)).Do)),您A在for循环中创建一个新实例i作为参数.这意味着在那时,取值i并发送给构造函数.因此,您发送的委托不是创建A委托,而是实际上是将构造函数的Do方法的委托发送A给构造函数.
但是,对于delegate() { (new A(i)).Do(); })(两者都有),您正在向i线程发送引用.
然后线程需要一些时间来启动,同时for循环继续.i在委托中使用的时间(即线程已经启动),for循环已经移动到3,这就是你所看到的.第二和第三个线程也是如此.启动三个线程,但等待启动线程完成一些工作.然后创建的线程启动(线程1,2和3)并且他们完成他们的工作.Windows通过for循环返回到线程,然后继续启动线程4和5.
一些阅读材料: