c#线程声明

时间:2012-12-28 19:41:20

标签: c# multithreading delegates declaration

我看到以下声明:

ThreadStart myThreadDelegate = new ThreadStart(Work.DoWork);
Thread myThread = new Thread(myThreadDelegate);
myThread.Start();

它们可以简化如下吗?

Thread myThread = new Thread(new ThreadStart(Work.DoWork));
myThread.Start();

如果是,第二种方法叫什么?每种方法的优点和缺点是什么?

6 个答案:

答案 0 :(得分:5)

它甚至可以简化为:

var myThread = new Thread(Work.DoWork);
myThread.Start();

没有多大区别。在您的第一个示例中,委托实例获得一个名称myThreadDelegate,理论上可以在该方法中稍后使用(可能是其他内容)。

如果你喜欢一个含有多个级别的长表达式,或许多带有临时变量的小表达式,那么这主要是一种品味问题。

在任何情况下,在我看来,使用方法组的隐式转换比在Work.DoWork中更简单,而不是写new ThreadStart(Work.DoWork)。查看句子 C#2.0提供了一种更简单的方法来编写How to: Declare, Instantiate, and Use a Delegate (C# Programming Guide)中的上一个声明。这种更简单的方法正式称为方法组转换

有关var关键字的信息,请参阅Implicitly Typed Local Variables (C# Programming Guide)

当然,你的例子中的终极单行将是:

(new Thread(Work.DoWork)).Start();

在这种情况下,您甚至没有获得对新线程(变量)的引用(实例方法Start()返回void)。

答案 1 :(得分:5)

是。它没有被称为任何东西,没有任何利弊。您可以使用其他C#语法糖:

Thread myThread = new Thread(Work.DoWork);
myThread.Start();

它会自动推断你想要创建一个ThreadStart委托对象。

答案 2 :(得分:1)

当然可以简化为第二种方法。但是,如果在调试期间需要其他对象,则它们将不可用。它们不太可能,但值得注意的是,构建更简洁的线条总是有这个缺点。

答案 3 :(得分:1)

是的,它可以。

如果委托仅用于作为对新Thread()方法的引用,那么该顺序可以通过这种方式进行优化 - 少一个对象声明。

答案 4 :(得分:1)

两者都是一样的。

在第一个示例中,您有myThreadDelegate但除了传递给Thread constructor之外没有其他用法。

答案 5 :(得分:0)

行, 有人建议这样做但后来删除了他/她的答案:

Thread myThread = new Thread ( () => Work.Dowork() );

那个东西叫做lambda表达式。