0

以下に示すようにコードを記述した場合、以下に示すように Method2 をスレッドに渡すにはどうすればよいですか? エラーが表示されます エラー

'System.Threading.Thread.Thread(System.Threading.ThreadStart)' に最も一致するオーバーロードされたメソッドには、無効な引数が含まれています

   class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Main Thread : ");           
            Thread obj = new Thread(Method2);
            obj.Start();                   
            Console.ReadLine();
        }       
        private static int Method2(int a)
        {
            return a;
        }
    }

次のコードを使用すると動作します

Thread obj = new Thread(() => Method2(1));

しかし、デリゲートオブジェクトを渡すと機能しないのはなぜですか

delegate int del(int i);

del d = Method2;

Thread obj = new Thread(d);

上記の 2 の違いは何ですか。最初のケースでは、デリゲート オブジェクトを直接渡した 2 番目のケースでラムダ式を使用しました。他に何かありますか?

4

2 に答える 2

1

これを試して:

Thread obj = new Thread(() => Method2(some_int_value));
于 2012-12-02T17:50:13.927 に答える
1

コンストラクターは、2 種類のThreadデリゲートを受け取りThreadStartますParameterizedThreadStart。これらのデリゲートが受け入れるメソッドのタイプを確認するには、それを作成できます。コンストラクターが表示します。たとえば、

var parameterMethod = new ParameterizedThreadStart(...

上記を入力すると、デリゲートがパラメーターとして 1 つのオブジェクトを持つ関数を受け取り、void を返すことがわかります。

void (object) target

これが、シグネチャがデリゲート ターゲット シグネチャと一致しないため、int を取るメソッドが機能しない理由です。ラムダでラップすると、実際にはパラメーターをとらずに void を返すメソッドを渡しているため、Method2 シグネチャは見られません。このようにラムダダでメソッド呼び出しをラップすると、署名を一致させるのに非常に役立ちます。

delegate void del(object obj);
del d = () => Method2(1);
Thread obj = new Thread(d);

可能なメソッド シグネチャは無数にあるため、スレッドとタスクはシンプルに保ち、何かを渡したい場合は単一のオブジェクトを渡すようにします。すべての型はオブジェクトから派生するため、これにより、必要なものを渡して、後でキャストできます。

于 2012-12-02T18:39:39.897 に答える