Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c语言中的基本线程#_C#_Multithreading - Fatal编程技术网

C# c语言中的基本线程#

C# c语言中的基本线程#,c#,multithreading,C#,Multithreading,我看过一些创建大量线程的示例代码,如下所示: var simpleThreads = new[] { new Thread(new ThreadStart(ThreadSimple)), new Thread(new ThreadStart(ThreadSimple)), new Thread(new ThreadStart(ThreadSimple)) }; 从逻辑上讲,这与下面的相同吗 var t

我看过一些创建大量线程的示例代码,如下所示:

var simpleThreads = new[] { 
            new Thread(new ThreadStart(ThreadSimple)), 
            new Thread(new ThreadStart(ThreadSimple)), 
            new Thread(new ThreadStart(ThreadSimple))
        };
从逻辑上讲,这与下面的相同吗

var ts = new ThreadStart(ThreadSimple);    
var simpleThreads = new[] { 
                new Thread(ts), 
                new Thread(ts), 
                new Thread(ts)
            };

我在两段代码上都放了秒表,它们花费的时间大致相同,所以我想知道为什么第一段代码是这样写的,除非是为了保存一行代码。

我认为第二个启用更好,因为您只创建了一个ThreadStart而不是3个,但我不知道这是否会因为在多个线程上共享此对象而产生问题。

我认为第二个启用更好,因为您只创建了一个ThreadStart而不是3个ThreadStart,但我不知道这是否会带来问题。

我认为第二个启用更好由于在多个线程上共享此对象,将出现问题。

这两个代码段在逻辑上不等价。

在第一个示例中,您有三个类型为ThreadStart的不同对象,而在第二个示例中,您只有一个。

这两个代码段在逻辑上不等价
var simpleThreads = new[] 
{  new Thread(new ThreadStart(ThreadSimple)),
 new Thread(new ThreadStart(ThreadSimple)),
 new Thread(new ThreadStart(ThreadSimple))  }; 
在第一个示例中,您有三个类型为ThreadStart的不同对象,而在第二个示例中,您只有一个

var simpleThreads = new[] 
{  new Thread(new ThreadStart(ThreadSimple)),
 new Thread(new ThreadStart(ThreadSimple)),
 new Thread(new ThreadStart(ThreadSimple))  }; 
和新线程(ts)不是一回事

在第一个代码块中,您生成了三个新的threadstart对象,尽管它引用了单个委托,但在第二个更好的实现中,您没有创建不必要的对象,也没有保存LOC

和新线程(ts)不是一回事


在第一个代码块中,您生成了三个新的threadstart对象,虽然引用了单个委托,但在第二个更好的实现中,您没有创建不必要的对象,也没有保存LOC。

我不能真正相信这个答案,但是,引用Marc Gravell的话


它们将产生同样的效果;它们在语义上是等价的。 代理是不可变的,这很有帮助

以我自己的浮躁方式扩张

这实际上不是关于线程的问题。如果传递了equal
ThreadStart
委托,则
Thread
构造函数将等效工作


委托类型的关键“属性”是其不变性。一旦不可变类型被实例化,就不能对其进行更改。这是相关的,因为两个代码示例中的所有
ThreadStart
委托都是使用
ThreadSimple
方法组构造的。因此,所有
线程
实例化都会传递一个等效的委托,而不管委托的生命周期如何

我真的不能相信这个答案,但引用马克·格雷威尔的话


它们将产生同样的效果;它们在语义上是等价的。 代理是不可变的,这很有帮助

以我自己的浮躁方式扩张

这实际上不是关于线程的问题。如果传递了equal
ThreadStart
委托,则
Thread
构造函数将等效工作


委托类型的关键“属性”是其不变性。一旦不可变类型被实例化,就不能对其进行更改。这是相关的,因为两个代码示例中的所有
ThreadStart
委托都是使用
ThreadSimple
方法组构造的。因此,所有
线程
实例化都会传递一个等效的委托,而不管委托的生命周期如何

委托是不可变的,没有可更改的属性。你是对的,我使用的示例不正确。但是你不能忽视这样一个事实:你正在创建三个不同的对象;然而,事实仍然是,你的第二段是误导性的:它是不可变的:没有什么可以改变或删除它。谢谢你引起我的注意。委托是不可变的,没有可更改的属性。你是对的,我使用的示例不正确。但是你不能忽视这样一个事实:你正在创建三个不同的对象;然而,事实仍然是,你的第二段是误导性的:它是不可变的:没有什么可以改变或删除它。谢谢你引起我的注意。它们也会有同样的效果;它们在语义上是等价的。代理是不变的,这很有帮助;它们在语义上是等价的。委托是不可变的,这有助于实现;分享不是问题,代表是不变的;分享不是问题