0

呼び出しがよくわかりません。現在のアクションを実行する必要があるスレッド (UI スレッド) で実行するように指示していることがわかります。しかし、私が理解できないのは、なぜこれほど多くの異なるバージョンを作成できるのかということです。例えば:

this.BeginInvoke(new MethodInvoker(delegate { currping.Text = Status; }));

this.BeginInvoke(new Action(() => {  currping.Text = Status; }));

違いがあるかどうかはわかりません。私が理解できることから、彼らは両方とも同じことをします。

ここで何か不足していますか?

4

2 に答える 2

3

Actionは .NET 3.5 フレームワークで、引数を取らず何も返さない一般的なデリゲートとして追加されましたがMethodInvoker、1.1 から存在していたため、通常は を使用した古いコードのみが表示されますMethodInvoker。2 つのデリゲート型の署名は同じです。

BeginInvoke()実際にはDelegateオブジェクトを取るので、引数を取らないデリゲートはそのオーバーロードで使用できます。((Delegate, object[])引数が必要なデリゲートにはオーバーロードがありますが、代わりに引数なしのクロージャーを使用する傾向があります。)

は一般的な型であるためDelegate、提供するデリゲートの型をなんらかの方法で指定する必要があります。コンパイラはそれ以外の方法では推論できないためです (以下を参照)。これはnew Action代替案よりも短いですが、数文字だけであり、多かれ少なかれ明確ではありません。

this.BeginInvoke((Action)(() => { ... }));

コンパイラは必要なデリゲート型を認識できないため、ここでデリゲート型を指定する必要があります。例えば:

Action foo = () => { };

fooこれが機能するのは、デリゲート型が であるべきの型に基づいてコンパイラが推論できるためActionです。

// All of these examples cause CS1660.
Delegate foo1 = () => { };
object foo2 = () => { };
var foo3 = () => { };

これらはコンパイル時のエラーです。署名に一致する多くのデリゲート型が「引数を取らずに戻りますvoid」があり、コンパイラはどれが必要かを認識していないためです。(また、objectandのvar場合、Expression<>デリゲートではないオブジェクトを意味している可能性もあります。ただしdelegate () {}、ラムダ式の代わりに使用すると、同じエラーが発生します。)

于 2013-08-29T18:51:59.873 に答える