5

次のシナリオがあります。

async void DoStuff() {
    // ...
}

button1.Click += (s, p) => {
    DoStuff();
};

async void最初の呼び出しがまだ不完全なときにメソッドを呼び出すとどうなるかわかりません。呼び出しは、呼び出されるたびに新しいスレッドを作成しますか、それとも呼び出しは、作成された前のスレッドを破棄してオーバーライドしますか?また、前者の仮定が正しい場合、ローカルメソッド変数は共有されますか?

編集:

async awaitWindows 8アプリでは動作が異なるため、誤解していました。asyncメソッドを呼び出すことは、私のような新しいスレッドを作成することと同じだと思った場合は、この明確なaricleを読んでください。

4

2 に答える 2

8

非同期voidメソッドを同時に複数回呼び出すとどうなるかわかりません

最初の呼び出しがまだ完了していない(「一時停止」されている可能性がある)ときに別の呼び出しが発生した場合はどうでしょうか。それはうまくいくでしょう。「オーバーライド」も「破壊」もありません。最終的には、ステートマシンの別のインスタンスが作成されます(これは、コンパイラーがビルドするものです)。

2つのステートマシンは完全に別個のローカル変数などを持ちます。もちろん、非同期メソッドのどこかでコンテキストのキャプチャを回避しない限り、実際に一度に実行できるのはそのうちの1つだけです。

非同期メソッドを開始しても、新しいスレッドは開始されないことを忘れないでください。asyncメソッド内で開始する一部の非同期操作は、新しいスレッドを開始する場合がありますが、それは別の問題です。生成されたコード内には、新しいスレッドを作成するものはありません。

于 2012-12-30T22:26:27.333 に答える
6

いいえ。

非同期メソッドはスレッドとは何の関係もありません。
むしろ、非同期メソッドは、通常のメソッド呼び出しとまったく同じように、最初のまで、呼び出し元のスレッドでコードを実行しますawait

それぞれの後のコードawaitは、待機可能なスレッドでコールバックを実行しました。
これは、あなたが何をしているのかによって異なりますawait
通常、オブジェクトを作成します。オブジェクトは、デフォルトでUIスレッドでコールバックを実行しますawaitTask

于 2012-12-30T22:26:32.017 に答える