【问题标题】:ThreadPool.QueueUserWorkItem with function argument/parameter带有函数参数/参数的 ThreadPool.QueueUserWorkItem
【发布时间】:2015-01-26 10:07:24
【问题描述】:

我有以下方法,我想使用 WaitCallBack 委托(C# 线程池)技术运行:

public void ExportData(string data){
//Codes goes in here
}

如何使用ThreadPool.QueueUserWorkItem(new WaitCallback(ExportData),object} 为了调用这个方法??

【问题讨论】:

  • 网上到处都是教程和例子。

标签: c# multithreading threadpool


【解决方案1】:

此函数期望的 WaitCallback 采用对象状态参数。所以你可以这样做:

string data = "some data";
ThreadPool.QueueUserWorkItem(state => ExportData((string)state), data);

或更新您的方法的签名:

public void ExportData(object state)
{
    string data = (string)state;
    //Codes goes in here
}

然后:

string data = "some data";
ThreadPool.QueueUserWorkItem(ExportData, data);

【讨论】:

    【解决方案2】:

    一些选项:

    • string 类型声明方法并强制转换
    • 改用 lambda 表达式,例如

      ThreadPool.QueueUserWorkItem(ignored => ExportData(value))
      

      我假设value 是当时范围内的字符串变量。这将在您每次执行此代码时创建一个新的委托实例,以捕获 value

    • 以上组合:

      ThreadPool.QueueUserWorkItem(x => ExportData((string) x), value)
      

      这将(可能)在每次调用时重用相同的委托实例,因为值是通过普通的WaitCallback 传递的,而不是被委托捕获。

    此外,您可能需要考虑使用更现代的Task API,除非您的目标是旧版本的 .NET。这是一种安排和管理任务的通常更愉快的方式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-08
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      相关资源
      最近更新 更多