gpt4 book ai didi

c# - 使用/不使用 delegate() 启动线程

转载 作者:可可西里 更新时间:2023-11-01 07:54:54 25 4
gpt4 key购买 nike

有什么区别:

new Thread(new ThreadStart(SomeFunc))

和:

new Thread( delegate() { SomeFunc();} )

这段代码在我的电脑上给出了奇怪的输出:

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
}

如果只执行第 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 运行。这些背后的技巧是什么?

谢谢。

最佳答案

通过委托(delegate),您正在捕获 i .

不同的是new ThreadStart((new A(i)).Do)) ,您正在创建 A 的新实例在fori 循环作为参数。这意味着在这一点上,i 的值被获取并发送给构造函数。因此,您发送的委托(delegate)不是 A 的创建者,但您实际上是在发送 Do 的委托(delegate)A 实例的方法给构造函数。

但是,对于 delegate() { (new A(i)).Do(); }) (两者),您发送的是 i 的引用到线程。

然后线程需要一些时间来启动,同时,for循环继续。到时候i在委托(delegate)中使用(即线程已启动),for循环已移至 3这就是你所看到的。第二个和第三个线程也是如此。三个线程已启动,但等待启动线程完成一些工作。然后创建的线程启动(线程 1、2 和 3)并开始工作。 Windows 返回到带有 for 的线程循环并继续启动线程 4 和 5。

一些阅读 Material :

关于c# - 使用/不使用 delegate() 启动线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4134229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com