适合初学者的智能线程池

时间:2014-01-24 16:54:08

标签: c# multithreading

我有一个叫做的函数: Request(out response,string a)返回一个布尔值 我想在多个线程中运行它,所以我写道:

ThreadPool.QueueUserWorkItem(new WaitCallback(Calss.Request), "");

(我不确定语法是否正确) 但是VS一直告诉我该函数必须有一个void作为返回

'expect a method with void request(object)' signature

我该怎么办?

1 个答案:

答案 0 :(得分:4)

这是一个有助于查看文档的情况。 对于方法ThreadPool.QueueUserWorkItem,它需要委托WaitCallback。您需要传递一个运行方法,该方法需要一个对象,一个对象用作该方法的参数。

您的方法与回调的签名不同。该方法与Action<Object>委托具有相同的签名。

您必须为要运行的具有所需签名的方法编写包装器方法:

void WrapperMethod(object state)
{
    string a = state.ToString();
    string response;  // whatever this out parameter is...
    Class.Request(out response,a);
}

然后设置你的主题:

ThreadPool.QueueUserWorkItem(WrapperMethod, ""); 

编译器实际上会为您设置委托。如果您运行的是.Net 4.5,则可以使用Task.Run

Task.Run(()=> Request(out response, a)); 

虽然不建议混合Task.Run和out参数。