将线程池与委托一起使用
本文关键字:一起 线程 | 更新日期: 2023-09-27 17:56:54
我正在尝试在ThreadPool
上使用QueueUserWorkItem
方法,但是,当我尝试将委托传递给该方法时遇到了一些问题。我想我的代码的问题在于我设置委托的方式,但我似乎无法弄清楚,即使在谷歌上搜索之后。
我正在像这样创建我的委托:
public delegate void GetLatencyDelegate(Server server);
我正在尝试遍历服务器列表并运行服务器 GetLatency 方法。每次我循环到新服务器时,都应该从池中运行一个新线程来运行 GetLatency 方法。这个想法是,这应该加快这个过程。我的代码如下:
ThreadPool.SetMaxThreads(50, 50);
foreach (Server server in serverList)
{
GetLatencyDelegate gld = new GetLatencyDelegate(server.GetLatency);
ThreadPool.QueueUserWorkItem(new WaitCallback(gld));
}
但是,我得到两个错误。一个是:
"'获取延迟委托'没有重载匹配委托 'System.Threading.WaitCallback'
另一个是:
'获取延迟'没有重载匹配委托 'Program.GetLatencyDelegate'
发生第一个错误是因为 WaitCallback
的签名与 GetLatencyDelegate
的签名不同。两者应该是相同的。
发生第二个错误是因为Server.GetLatency
也没有与GetLatencyDelegate
兼容的签名:前者不接受任何参数,而后者希望传入Server
实例。
事实上,绝对没有必要首先定义GetLatencyDelegate
。您可以简单地提供一个具有与 WaitCallback
兼容的签名的 lambda:
foreach (Server server in serverList)
{
ThreadPool.QueueUserWorkItem(srv => ((Server)srv).GetLatency(), server);
}
尝试如下:
ThreadPool.SetMaxThreads(50, 50);
foreach (Server server in serverList)
{
ThreadPool.QueueUserWorkItem(state =>
{
var srv = ((Server)state);
srv.GetLatency(srv);
}, server);
}