c# - 使用带有委托(delegate)的线程池?

标签 c# multithreading delegates threadpool

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

我正在像这样创建我的委托(delegate):

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

            }

但是,我得到两个错误。一个是:

"No overload for 'GetLatencyDelegate' matches delegate 'System.Threading.WaitCallback'



另一个是:

'No overload for 'GetLatency' matches delegate 'Program.GetLatencyDelegate'

最佳答案

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

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

实际上完全没有必要定义GetLatencyDelegate首先。您可以简单地提供一个签名与 WaitCallback 兼容的 lambda。 :

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

关于c# - 使用带有委托(delegate)的线程池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14645670/

相关文章:

php - 如何防止php中的两个单独的ajax调用修改同一个数据库

c++ - promise 可以使用结构类型吗?

c# - 识别 Action<T> 类中的 "actions"列表(将分配哪些属性)

ios - 如果 <UIAlertViewDelegate> 被弃用,我如何让我的警报按钮执行操作?

c# - 如何在不更改行的情况下查看 DataGridView 更改

c# - 如何将表格中的所有文本写为行

c# - 在这种情况下锁定是否保证多个修改在线程间是原子的?

c# - 使用 Action.Invoke 是否被认为是最佳实践?

c# - XNA 碰撞检测与游戏速度

c# -/= 在 C# 中是什么意思?