为什么必须有一个委托来桥接一个线程及其方法?

smw*_*dia 1 .net multithreading delegates

以下代码很常见:

Work w = new Work();
w.Data = 42;
threadDelegate = new ThreadStart(w.DoMoreWork);
newThread = new Thread(threadDelegate);
newThread.Start();
Run Code Online (Sandbox Code Playgroud)

我只是想知道,为什么必须有一个委托桥接线程和方法在该线程上执行?

我们可以直接将方法名称发送给Thread吗?

Jon*_*eet 5

我们可以直接将方法名称发送给Thread吗?

作为一个字符串?EWWW.如果不是字符串,你会如何建议告诉线程执行什么?委托是在.NET中表示"使用特定签名执行某些内容" 的惯用方法.

请注意,您不需要使用new ThreadStart或使用单独的变量.这可以使用方法组转换正常工作:

newThread = new Thread(w.DoMoreWork);
newThread.Start();
Run Code Online (Sandbox Code Playgroud)

或者,如果您不需要所有这些变量:

new Thread(new Work { Data = 42 }.DoWork).Start();
Run Code Online (Sandbox Code Playgroud)

编辑:请注意,从.NET 4开始,使用任务并行库通常更好的做法.

  • 顺便说一下Jon,除了类似的用法之外,托管委托和C函数指针之间是否存在任何关系(例如,启动一个线程)?我知道代理人很可能拥有一个内部方法列表,因为它有`+ =`运算符,但还有什么可以说的呢? (2认同)