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

            }

ただし、2 つのエラーが発生します。1つは次のとおりです。

「'GetLatencyDelegate' のオーバーロードは、デリゲート 'System.Threading.WaitCallback' と一致しません。

もう一つは:

'GetLatency' のオーバーロードがデリゲート 'Program.GetLatencyDelegate' に一致しません

4

2 に答える 2

3

最初のエラーは、 の署名が の署名WaitCallbackと異なるために発生しGetLatencyDelegateます。この 2 つは同一である必要があります。

2 番目のエラーは、 にServer.GetLatencyも と互換性のある署名がないために発生しGetLatencyDelegateます。前者はパラメーターを受け入れませんが、後者はServerインスタンスが渡されることを期待しています。

実際、そもそも定義する必要はまったくありませんGetLatencyDelegate。と互換性のある署名をラムダに提供するだけです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 に答える