【问题标题】:C# Execute Method (with Parameters) with ThreadPool带有 ThreadPool 的 C# 执行方法(带参数)
【发布时间】:2010-04-19 23:41:46
【问题描述】:

我们有以下代码(此代码的想法可在此网站上找到),它将为“Do_SomeWork()”方法生成新线程。这使我们能够多次异步运行该方法。

代码是:

    var numThreads = 20;
    var toProcess = numThreads;

    var resetEvent = new ManualResetEvent(false);

    for (var i = 0; i < numThreads; i++)
    {
        new Thread(delegate()
        {
            Do_SomeWork(Parameter1, Parameter2, Parameter3);
            if (Interlocked.Decrement(ref toProcess) == 0) resetEvent.Set();
        }).Start();
    }

    resetEvent.WaitOne();

但是,我们希望使用 ThreadPool 而不是创建我们自己的新线程,这可能会损害性能。问题是我们如何修改上面的代码以利用 ThreadPool 记住方法“Do_SomeWork”接受多个参数并且还具有返回类型(即方法不是 void)。

另外,这是 C# 2.0。

【问题讨论】:

    标签: c# multithreading parameters threadpool


    【解决方案1】:

    几乎相同的方式,但使用传递给 ThreadPool.QueueUserWorkItem 的 WaitCallback:

    var numThreads = 20;
    var toProcess = numThreads;
    
    var resetEvent = new ManualResetEvent(false);
    
    for (var i = 0; i < numThreads; i++)
    {
        ThreadPool.QueueUserWorkItem (
            new WaitCallback(delegate(object state) {
            Do_SomeWork(Parameter1, Parameter2, Parameter3);
            if (Interlocked.Decrement(ref toProcess) == 0) resetEvent.Set();
        }), null);
    }
    
    resetEvent.WaitOne();
    

    【讨论】:

    • 只是想在传递空对象/tasksInfo 的同时在回调上运行你的方法是否真的很酷
    【解决方案2】:

    使用 C# 2.0,您可以调用

    ThreadPool.QueueUserWorkItem(callback, new object[] { parm1, parm2, etc });
    

    然后在回调中将 object[] 转换回正确的参数和类型。关于返回类型,如果使用 ThreadPool 我认为您无法获取返回值,回调必须具有签名

    void Callback (object parm)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-30
      • 1970-01-01
      • 2015-03-15
      • 1970-01-01
      • 2013-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多