C#使用成员函数的委托来创建新线程
本文关键字:新线程 创建 线程 成员 函数 | 更新日期: 2023-09-27 18:24:48
我想为成员函数创建一个新线程。我目前使用这个代码,
Thread thread = new Thread(new ThreadStart(c.DoSomethingElse));
thread.Start();
它正在发挥作用。但现在我想参数化成员函数。
我有这个班:
class C1 {
public void DoSomething() {}
public void DoSomethingElse() {}
public delegate void myDelegate(C1 c);
}
然后我在其他类中有这个函数:
public void myFunction(C1.myDelegate func) {
C1 c = new C1();
func(c); // this is working
// but I want that the called function runs in it's own thread
// so I tried...
Thread thread = new Thread(new ThreadStart( func(c) ); // but the compile wants a
thread.Start(); // method name and not a delegate
}
我调用myFunction如下。。。
myFunction( (c) => c.DoSomething() );
这样做可能吗。我的意思是,我可以传递委托并用对象func(c)调用它。我可以创建一个传递object.memberfunction的新线程。但我不知道如何将两者结合起来,使用memberfunction委托并将其传递给ThreadStart函数。有什么提示吗?
我建议使用.NET.中内置的并行性
Task.Factory.StartNew(() => func(c));
您需要使用Thread.Start(parameter)
的另一个过载
new Thread(c.DoSomethingElseWithParameter).Start(someparameter);
编辑:
对于您自己的代表,请尝试此操作。
Thread thread = new Thread(() => func(c));
thread.Start();
注意:如果不使用Lambda
或Anonymous method
,则方法签名应为void MethodName(object obj)
您可以执行以下操作:
Thread thread = new Thread(new ThreadStart(() => func(c));
如果您可以访问4.0,我建议您使用任务并行库。下面是一个基于您的代码的示例。
class TPL
{
public delegate void myDelegate(object cgf);
public static void Test(myDelegate func)
{
object c = new object();
Task t = new Task(() => func(c));
t.Start();
}
}
这是一个链接http://msdn.microsoft.com/en-us/library/dd537609.aspx
TPL值得一看,尤其是StartNew方法。它使用线程池而不是显式线程,因此它甚至可能性能更好。
可以将lambda表达式作为参数传递。我做到了,工作顺利。