1

我正在尝试在 上使用该QueueUserWorkItem方法ThreadPool,但是,当我尝试将委托传递给该方法时遇到了一些问题。我想我的代码的问题在于我设置委托的方式,但我似乎无法弄清楚,即使在谷歌上搜索之后也是如此。

我正在像这样创建我的代表:

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'

4

2 回答 2

3

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

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

事实上,绝对没有必要首先定义GetLatencyDelegate。您可以简单地提供一个签名兼容的 lambda WaitCallback

foreach (Server server in serverList)
{
    ThreadPool.QueueUserWorkItem(srv => ((Server)srv).GetLatency(), server);
}
于 2013-02-01T11:55:48.300 回答
0

试试这样:

ThreadPool.SetMaxThreads(50, 50);

foreach (Server server in serverList)
{
    ThreadPool.QueueUserWorkItem(state => 
    {
        var srv = ((Server)state);
        srv.GetLatency(srv);
    }, server);
}
于 2013-02-01T11:56:02.110 回答