C#中的多线程:如何将函数名称传递给另一个函数来启动新线程?

我在我的C#代码中使用多线程如下:

Thread startThread;

public void NewThread()
{
   ThreadStart starter = delegate { foo(); };
   startThread = new Thread(starter);
   startThread.Start();
}

private void foo()
{
   //do some work
}

然后在我的应用程序中,我调用NewThread()来运行新线程。

但是现在我在每个类上都有很多线程,并且每个类都有一个NewThread(),我想把它移动到一个静态的Util类,并在每次我希望在该函数上有一个新线程时将它传递给它。

你知道这是怎样做的最佳方法,如果是的话我怎样才能将函数名称作为参数传递给它?


#1楼

看看下面有关Codeproject“ 穷人的Parallel.ForEach Iterator ”的文章。 我认为这正是你在寻找的东西。 非常好用。

对于更强大的东西,还可以看一下Power Threading Library


#2楼

好吧,由于该方法是私有的,调用者知道方法名称是否有意义? 如果它是公开的,您可以传递方法:

public void NewThread(Action task)
{
   ThreadStart starter = delegate { task(); };
   startThread = new Thread(starter);
   startThread.Name = task.Method.Name;
   startSpoolerThread.Start();
}

public void foo()
{
   //do some work
}

NewThread(obj.foo);

但是,对于私有方法,我怀疑枚举/开关是最好的选择......

NewThread(TasktType.Foo);

或者,你可以通过反思获得方法......

public void NewThread(string name)
{
    MethodInfo method = GetType().GetMethod(name,
        BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic,
        null, Type.EmptyTypes, null);
    ThreadStart starter = delegate { method.Invoke(this, null); };
    // etc (note: no point using Delegate.CreateDelegate for a 1-call usage

#3楼

我建议您考虑查看并行扩展任务API的CTP; 你没有提到为什么你需要一个主题,但他们已经自动化了大部分内容,这是他们博客的链接


#4楼

除非有明确创建线程的特定原因,否则为什么不使用Threadpool? Threadpool.QueueUserWorkItem方法将委托作为要执行的工作单元。 委托是一种特定类型,但您可以像在示例中一样将自己的委托调用包装在其中。 除非您需要精细控制或取消,否则通常最好使用线程池而不是自己旋转线程。


#5楼

或者,如果您正在使用Win.Forms或类似的基于GUI的应用程序,我建议使用BackgroundWorker 。 它负责为大多数与线程相关的事件进行编组,并且中止(如果这是你需要做的事情)也不那么复杂。


#6楼

代理已经提供了一种异步执行它们的方法。 例如:

delegate void dowork();
private static void WorkDone(IAsyncResult result)
{
   ((dowork)result.AsyncState).EndInvoke(result);
    // this function is called when the delegate completes
}
public void Start()
{
    dowork dw = delegate {// code in this block has it's own thread };
    dw.BeginInvoke(WorkDone, null);
}

所以为了将函数指针传递给其他任何东西,你只需要创建一个具有正确签名的委托(在这种情况下我使用了匿名方法,但你可以使用任何具有正确签名的函数)并调用它的BeginInvoke方法,传递一个函数将在完成后被调用..该函数必须在原始委托上调用EndInvoke,并将其传递给result参数中的WorkDone函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值