3

私は.NET4.5、特に非同期/待機機能をいじり始めています。

驚いたことに、コンパイルする以下のコードにたどり着きました。誰かが私の理由を説明できますか?

async Task SomeMethod()
{
    try
    {
        await Task.Delay(1000);
    }
    catch
    {

    }
}

以前の.NETバージョンでは、コンパイラは「すべてのパスが値を返すわけではありません」のようなメッセージで文句を言います。

4

2 に答える 2

5

戻る非同期メソッドTaskは、を返す通常のメソッドと同等voidです。ここにはtry/catch固有のものは何もありません-tryブロックも何も返さないことを忘れないでください!

したがって、コードの非同期バージョンは次のようになります。

void SomeMethod()
{
    try
    {
        Thread.Sleep(1000)
    }
    catch
    {
    }
}

...そして明らかにそれはコンパイルされるでしょう。(同様に明らかに、裸で使用するのは恐ろしいですが、それcatchは実際には問題ではないと思います:)

このコードはコンパイルされません:

async Task<int> SomeMethod()
{
    try
    {
        await Task.Delay(1000);
        return 10;
    }
    catch
    {

    }
}
于 2012-08-22T07:47:43.703 に答える
1

Jonの回答に対するあなたの質問に応えて、読みやすくするためにこれらのリンクを別の回答として追加します。

舞台裏で何が起こっているかについての詳細を知るために、MSDNマガジンからこれらの記事を紹介したいと思います。

MSDN 2011年10月号:.NETを使用した並列プログラミング

  1. 一時停止してAwaitで遊ぶ
  2. 非同期パフォーマンス:非同期と待機のコストを理解する
  3. 新しいVisualStudioAsyncCTPを使用したより簡単な非同期プログラミング

特に最初の2つの記事は、コンパイラーがコードを内部的に書き直して機能させる方法をよりよく説明しているため、探しているものかもしれませんasync/ await

于 2012-08-22T08:11:04.127 に答える