85

次のコードがあります。

WebClient wc = new WebClient();
string result;
try
{
  result = await wc.DownloadStringTaskAsync( new Uri( "http://badurl" ) );
}
catch
{
  result = await wc.DownloadStringTaskAsync( new Uri( "http://fallbackurl" ) );
}

基本的にURLからダウンロードしたいのですが、例外で失敗した場合は別のURLからダウンロードしたいです。もちろん、両方の時間は非同期です。ただし、コードはコンパイルされません。

エラー CS1985: catch 句の本文で待機できません

OK、何らかの理由で禁止されていますが、正しいコード パターンは何ですか?

編集:

幸いなことに、C# 6.0 では、catch と finally ブロックの両方で await 呼び出しが許可される可能性があります

4

9 に答える 9

106

更新: C# 6.0 は catch で await をサポートします


古い回答:フラグを使用しawaitてブロックから移動するようにそのコードを書き直すことができます。catch

WebClient wc = new WebClient();
string result = null;
bool downloadSucceeded;
try
{
  result = await wc.DownloadStringTaskAsync( new Uri( "http://badurl" ) );
  downloadSucceeded = true;
}
catch
{
  downloadSucceeded = false;
}

if (!downloadSucceeded)
  result = await wc.DownloadStringTaskAsync( new Uri( "http://fallbackurl" ) );
于 2012-01-15T12:24:33.907 に答える
9

これはうまくいくようです。

        WebClient wc = new WebClient();
        string result;
        Task<string> downloadTask = wc.DownloadStringTaskAsync(new Uri("http://badurl"));
        downloadTask = downloadTask.ContinueWith(
            t => {
                return wc.DownloadStringTaskAsync(new Uri("http://google.com/")).Result;
            }, TaskContinuationOptions.OnlyOnFaulted);
        result = await downloadTask;
于 2012-10-27T15:55:41.143 に答える
7

これを試してください:

         try
        {
            await AsyncFunction(...);
        }

        catch(Exception ex)
        { 
            Utilities.LogExceptionToFile(ex).Wait();
            //instead of "await Utilities.LogExceptionToFile(ex);"
        }

(Wait()エンディングを見る)

于 2015-03-04T01:21:33.553 に答える
1

次のようにラムダ式を使用できます。

  try
    {
        //.....
    }
    catch (Exception ex)
    {
        Action<Exception> lambda;

        lambda = async (x) =>
        {
            // await (...);
        };

        lambda(ex);
    }
于 2015-11-08T07:37:19.877 に答える
1

awaitcatch ブロックの後にを置き、その後labelに を置き、gotoを try ブロックに入れることができます。(いや、本当に! 後藤は悪くない!)

于 2014-11-10T10:56:26.763 に答える