6

私のプログラムでは、4 つのスレッドで調べる必要がある大量のデータを分割します。

Thread one = new Thread(delegate() { NewMethod(recordsSplitIntoQuarters[0], param2, param3, param4, param5); });
Thread two = new Thread(delegate() { NewMethod(recordsSplitIntoQuarters[1], param2, param3, param4, param5); });
Thread three = new Thread(delegate() { NewMethod(recordsSplitIntoQuarters[2], param2, param3, param4, param5); });
Thread four= new Thread(delegate() { NewMethod(recordsSplitIntoQuarters[3], param2, param3, param4, param5); });

私たちのコーディング標準では、いわば StyleCop に準拠する必要があり、StyleCop は次のことを要求しています。

SA1410: デリゲートのパラメーター リストが空であるため、匿名メソッドからかっこを削除します。

これを行うと、次のコンパイラ エラーが発生します。

次のメソッドまたはプロパティ間の呼び出しがあいまいです: 'System.Threading.Thread.Thread(System.Threading.ParameterizedThreadStart)' と 'System.Threading.Thread.Thread(System.Threading.ThreadStart)'

ThreadStart オブジェクトと ParameterizedThreadStart オブジェクトを調べましたが、これらのオブジェクトのいずれかで必要なことを行う方法がわかりません。

私の質問: 匿名のデリゲートはどのように機能しますか? それらは何にコンパイルされますか?最終的には、匿名のデリゲートなしでこれを機能させる必要がありますが、どこから始めればよいかわかりません。

助けてくれてありがとう、

シーカー

4

3 に答える 3

7

次の 2 つのオプションがあります。

  • StyleCop の警告を無視する (推奨)
  • に変更しますnew ThreadStart(delegate { ... })

説明:

かっこ ( ) のない無名メソッドにdelegate { ... }は、暗黙的なパラメーター リストがあります。コンパイラは、使用されているデリゲートと一致するために必要なパラメーターをすべて与えます。(あなたのコードはパラメーターを見ることができません)
これは、パラメーターを使用しない匿名イベント ハンドラーを作成するときに非常に便利です。入力する手間が省けますdelegate(object sender, EventArgs e) { ... }

ただし、Threadコンストラクターを呼び出す場合、2 種類のデリゲートを受け取る 2 つの異なるオーバーロードがあります。
パラメーター リストを指定していないため、コンパイラは、作成しようとしているデリゲートの型を知る方法がありません。

于 2010-11-30T20:50:21.360 に答える
5

StyleCopはばかげています。

StyleCop は、2 つの構文が同じ意味を持つことを暗示しています。 これは完全に間違っています。 デリゲートからかっこを省略しても、「これは引数を取らない」という意味ではありません。これは、「いずれにしても使用しないため、引数を入力してください」という意味です。

Since two different signatures of Thread:.ctor are available, each taking a different delegate type, the compiler cannot know which one to pick, since it would be just fine with either one. Adding the parentheses forces the compiler to pick the ThreadStart variant, since it is the only signature with a delegate type compatible with your anonymous method.

If you want to make StyleCop happy and have your code compile, this is one option:

Thread one = new Thread(new ThreadStart(delegate { NewMethod(recordsSplitIntoQuarters[0], param2, param3, param4, param5); }));

This is another:

Thread one = new Thread((ThreadStart) delegate { NewMethod(recordsSplitIntoQuarters[0], param2, param3, param4, param5); });

But my suggestion would be to LART the StyleCop authors for introducing this ridiculous rule.

于 2010-11-30T20:52:34.647 に答える
3

delegateキーワードの代わりにラムダ式を使用できます。

Thread one = new Thread(() => NewMethod(recordsSplitIntoQuarters[0], param2, param3, param4, param5));
于 2010-11-30T20:53:44.823 に答える