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();
注意:如果不使用Lambda
或Anonymous method
,您的方法签名应该是void MethodName(object obj)
【讨论】:
这不是和问题中的第一个块一样吗?为硬编码的成员函数启动一个thead 正在工作。但是在 myFunction 中我没有 DoSomething 或 DoSomethingElse,我只有一个 func 委托或任何我可以传递给 myFunction 的东西。那么如何从 myFunction 的外部参数化 DoSomethingElseWithParameters 呢? 那么你想在线程中传递委托或传递参数吗? @bebo 我已经更新了我的答案,请查看。我的回答和你的问题不一样,请仔细阅读我的Note:
部分。如果您的方法有different signature
,请使用Lambda
或Anonymous 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# 使用成员函数的委托来创建新线程的主要内容,如果未能解决你的问题,请参考以下文章