11

ParameterizedThreadStartを使用してスレッドを作成しようとすると問題が発生します。これが私が今持っているコードです:

public class MyClass
{
    public static void Foo(int x)
    {
        ParameterizedThreadStart p = new ParameterizedThreadStart(Bar); // no overload for Bar matches delegate ParameterizedThreadStart
        Thread myThread = new Thread(p);
        myThread.Start(x);
    }

    private static void Bar(int x)
    {
        // do work
    }
}

オンラインで見つけた例は同じことをしているように見えるので、何が間違っているのかよくわかりません。

4

6 に答える 6

17

苛立たしいことに、デリゲート型には1つのパラメーターParameterizedThreadStartを受け入れる署名があります。object

基本的に、次のようなことを行う必要があります。

// This will match ParameterizedThreadStart.
private static void Bar(object x)
{
    Bar((int)x);
}

private static void Bar(int x)
{
    // do work
}
于 2011-03-01T21:33:32.497 に答える
7

これはParameterizedThreadStart次のようになります。

public delegate void ParameterizedThreadStart(object obj); // Accepts object

これがあなたの方法です:

private static void Bar(int x) // Accepts int

これを機能させるには、メソッドを次のように変更します。

private static void Bar(object obj)
{
    int x = (int)obj;
    // todo
}
于 2011-03-01T21:35:07.033 に答える
3

バーをに変更する必要があります

private static void Bar(object ox)
{
   int x = (int)ox;
   ...
}

ParameterisedThreadStartに渡す関数には、Object型の単一のパラメーターが1つ必要です。他には何もありません。

于 2011-03-01T21:36:21.930 に答える
3

メソッドはパラメータBarを受け入れる必要がありobjectます。intあなたは内側にキャストする必要があります。役に立たないメソッドの作成を避けるために、ここではラムダを使用します。

public static void Foo(int x)
{
    ParameterizedThreadStart p = new ParameterizedThreadStart(o => Bar((int)o));
    Thread myThread = new Thread(p);
    myThread.Start(x);
}

private static void Bar(int x)
{
    // do work
}
于 2011-03-01T21:33:39.300 に答える
3

オブジェクト引数を期待しているので、任意の変数を渡すことができます。次に、必要な型にキャストする必要があります。

private static void Bar(object o)
{
    int x = (int)o;
    // do work
}
于 2011-03-01T21:35:33.680 に答える
1

Barobjectではなく、inパラメータを取る必要がありますint

private static void Bar(object x)
{ 
    // do work
}
于 2011-03-01T21:35:35.370 に答える