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函数。有什么提示吗?

C#使用成员函数的委托来创建新线程

我建议使用.NET.中内置的并行性

Task.Factory.StartNew(() => func(c));

您需要使用Thread.Start(parameter) 的另一个过载

new Thread(c.DoSomethingElseWithParameter).Start(someparameter);

编辑:

对于您自己的代表,请尝试此操作。

   Thread thread = new Thread(() =>  func(c));
   thread.Start();

注意:如果不使用LambdaAnonymous 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表达式作为参数传递。我做到了,工作顺利。