1

我想为成员函数创建一个新线程。我目前使用此代码,

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 的新线程。但我不知道如何将两者结合起来,使用成员函数委托并将其传递给 ThreadStart 函数。有什么提示吗?

4

5 回答 5

4

我建议使用 .NET 中内置的 Parallelism。

Task.Factory.StartNew(() => func(c));
于 2013-07-23T21:25:49.990 回答
3

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

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

编辑:

对于您自己的代表,试试这个。

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

注意:您的方法签名应该是void MethodName(object obj)if not use a LambdaorAnonymous method

于 2013-07-23T21:17:54.860 回答
2

你可以这样做:

Thread thread = new Thread(new ThreadStart(() => func(c));
于 2013-07-23T21:17:49.143 回答
2

如果您可以访问 4.0,我建议使用 Task Parallel Library。这是一个基于您的代码的示例。

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

于 2013-07-23T21:19:15.340 回答
1

TPL 值得一看,尤其是StartNew 方法。它使用线程池而不是显式线程,因此它的性能甚至可能更好。

您可以将 lambda 表达式作为参数传递。我做到了,工作顺利。

于 2013-07-23T21:17:34.767 回答