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

Posted

技术标签:

【中文标题】C# 使用成员函数的委托来创建新线程【英文标题】:C# Using a delegate to a member function to create a new thread 【发布时间】:2013-07-23 21:10:12 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

我没有注意到答案刷新但是是的@DasKrümelmonster 在我之前也有同样的想法。按照他的链接。【参考方案2】:

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

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

编辑:

为您自己的代表试试这个。

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

注意:如果不使用LambdaAnonymous method,您的方法签名应该是void MethodName(object obj)

【讨论】:

这不是和问题中的第一个块一样吗?为硬编码的成员函数启动一个thead 正在工作。但是在 myFunction 中我没有 DoSomething 或 DoSomethingElse,我只有一个 func 委托或任何我可以传递给 myFunction 的东西。那么如何从 myFunction 的外部参数化 DoSomethingElseWithParameters 呢? 那么你想在线程中传递委托或传递参数吗? @bebo 我已经更新了我的答案,请查看。我的回答和你的问题不一样,请仔细阅读我的Note: 部分。如果您的方法有different signature,请使用LambdaAnonymous method。我提的很清楚。【参考方案3】:

你可以这样做:

Thread thread = new Thread(new ThreadStart(() => func(c));

【讨论】:

【参考方案4】:

如果您可以访问 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

【讨论】:

【参考方案5】:

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

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

【讨论】:

以上是关于C# 使用成员函数的委托来创建新线程的主要内容,如果未能解决你的问题,请参考以下文章

Java - 使用成员函数启动线程

C ++创建具有非静态成员函数的线程

CLR via C# 笔记 -- 委托(17)

C# 怎样用反射创建的对象的给成员委托实例注册方法

类内定义线程的回调函数问题

c# 中的线程和同步