4

これはコンパイルエラーをスローしませんが、なぜですか?

public async void DoSomething(object arg){ ... }

Action<object> myAnonActionDelegate = DoSomething;

「」には、アクションではなくDoSomethingタイプの署名を含めるべきではありませんか?Func<object,Task>実際、「 」は委任DoSomethingに割り当てることはできません。Func<object,Task>

問題はなぜですか?asyncキーワードについての私の理解はオフですか?

4

1 に答える 1

6

「DoSomething」には、Func<object,Task>アクションではなくタイプの署名を含めるべきではありませんか?

いいえ-メソッドは何も返しません。宣言を見てください-それはvoid、ではなくTaskです。このasync部分は、コンパイラー(およびそれを読み取る人間)の利益のためだけのものです。実際には、メソッドのシグニチャーの一部ではありません。非同期メソッドは、、、または-のいずれかを返す必要voidTaskありますTask<T>が、メソッドの戻り型は実際には宣言したとおりです。voidコンパイラはあなたをTask魔法のように変えません。

これで、まったく同じメソッド本体を記述して、メソッドを次のように宣言できます。

public async Task DoSomething(object arg){ ... }

その時点で使用する必要がありますが、これFunc<object, Task>は別のメソッド宣言です。

非同期メソッドを使用してイベントをサブスクライブしている場合をTask 除いて、フォームを返すことを強くお勧めします。呼び出し元がメソッドの進行状況や失敗などを監視できるようにすることもできます。

于 2012-05-22T19:57:56.743 に答える