带有函数参数/参数的ThreadPool.QueueUserWorkItem

时间:2015-01-26 10:07:24

标签: c# multithreading threadpool

我有以下方法,我想使用WaitCallBack委托(C#Thread-Pooling)技术运行:

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

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

2 个答案:

答案 0 :(得分:3)

此函数期望的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);

答案 1 :(得分:2)

一些选项:

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

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

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

  • 以上各项的组合:

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

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

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