C# 与委托一起使用线程池?

C# 与委托一起使用线程池?,c#,multithreading,delegates,threadpool,C#,Multithreading,Delegates,Threadpool,我试图在线程池上使用QueueUserWorkItem方法,但是,当我试图将委托传递给该方法时,遇到了一些问题。我想我的代码的问题在于我设置委托的方式,但我似乎无法找到它,即使在谷歌上搜索过 我这样创建我的代理: public delegate void GetLatencyDelegate(Server server); 我正在尝试遍历服务器列表并运行servers GetLatency方法。每次我循环到新服务器时,都应该从池中运行一个新线程来运行GetLatency方法。我们的想法是,这应

我试图在
线程池
上使用
QueueUserWorkItem
方法,但是,当我试图将委托传递给该方法时,遇到了一些问题。我想我的代码的问题在于我设置委托的方式,但我似乎无法找到它,即使在谷歌上搜索过

我这样创建我的代理:

public delegate void GetLatencyDelegate(Server server);
我正在尝试遍历服务器列表并运行servers GetLatency方法。每次我循环到新服务器时,都应该从池中运行一个新线程来运行GetLatency方法。我们的想法是,这应该加快这一进程。我的代码如下:

            ThreadPool.SetMaxThreads(50, 50);

            foreach (Server server in serverList)
            {
                GetLatencyDelegate gld = new GetLatencyDelegate(server.GetLatency);
                ThreadPool.QueueUserWorkItem(new WaitCallback(gld));

            }
但是,我有两个错误。一个是:

“GetLatencyDelegate”与委托匹配时没有重载 'System.Threading.WaitCallback'

另一个是:

'GetLatency'没有重载与委托匹配 “Program.GetLatencyDelegate”


出现第一个错误是因为的签名与的签名不同。这两个签名应该相同

出现第二个错误是因为
Server.GetLatency
也没有与
GetLatencyDelegate
兼容的签名:前者不接受任何参数,而后者希望传入
Server
实例

事实上,根本不需要首先定义
GetLatencyDelegate
。您只需提供一个lambda,其签名与
WaitCallback
兼容即可:

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);
}

尝试
ThreadPool.QueueUserWorkItem((p)=>new WaitCallback(gld));
一个是与void GetLatencyDelegate(服务器)相同签名的server.GetLatency因为如果不是这样,那么它就不起作用了。2当您调用委托时,您没有将参数传递到threadpool.threadpool.QueueUserWorkItem(new WaitCallback(ThreadProc),Server);根据他的委托定义,
GetLatency
方法接受一个
Server
参数。