将ThreadPool与Delegate一起使用?

时间:2013-02-01 11:49:55

标签: c# multithreading delegates threadpool

我正在尝试在QueueUserWorkItem上使用ThreadPool方法,但是,当我尝试将委托传递给方法时,我遇到了一些问题。我想我代码的问题在于我设置代理的方式,但即使在google上搜索之后我也无法弄明白。

我正在创建我的代表:

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

            }

然而,我收到两个错误。一个是:

  

“'GetLatencyDelegate'没有超载匹配委托   'System.Threading.WaitCallback'

另一个是:

  

''GetLatency'没有超载匹配委托   'Program.GetLatencyDelegate'

2 个答案:

答案 0 :(得分:3)

发生第一个错误是因为WaitCallback的签名与GetLatencyDelegate的签名不同。两者应该完全相同。

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

事实上,首先无需定义GetLatencyDelegate。您只需提供一个带有与WaitCallback兼容的签名的lambda:

foreach (Server server in serverList)
{
    ThreadPool.QueueUserWorkItem(srv => ((Server)srv).GetLatency(), server);
}

答案 1 :(得分:0)

试试这样:

ThreadPool.SetMaxThreads(50, 50);

foreach (Server server in serverList)
{
    ThreadPool.QueueUserWorkItem(state => 
    {
        var srv = ((Server)state);
        srv.GetLatency(srv);
    }, server);
}