0

今後の更新: TL;DR で非同期メソッドの式をキャッチするにはawait、 、Task.WaitAll、または.Result.

他の非同期メソッドを実行するだけのやや複雑な非同期メソッドを作成しました。行 var mSpekTask... だけが重要であるため、ほとんど無視できます。また、ロジックは気にしません。例外がどこに行ったかを知りたいだけです。私の主な問題は、 mSpecTask 内で例外が確実に発生しても、 ex.ToString() がヒットしないことです。

public async Task LoadAsync(IEnumerable<ProductRequest> feed, int? customerId,
    IProgress<int> mSpecProgress, Action<Task> mSpecCompletionHandler)
{
    var ids = feed.Select(x => x.ProductId.ToString()).Distinct().ToList();

    try
    {
        var mSpecTask = this.LoadMSpecAsync(mSpecProgress, ids);
    }
    catch (Exception ex)
    {
        ex.ToString();
    }
}

LoadMSpecAsync のコードは次のとおりです。

public Task<ResultSet> LoadMSpecAsync(IProgress<int> prg, IEnumerable<string> ids)
{
    return this.LoadAsync(prg, ids, Selector.M, SPMS, x => x.Order);
}

LoadAsync のコードを次に示します。 await db.ExecuteTVP(progress, spName, ids, parameters) は例外を生成します。

private async Task<Dictionary<Pair, dynamic>> LoadAsync(IProgress<int> progress,
    IEnumerable<string> ids, Selector s, string spName, Func<dynamic, int> k,
    Func<dynamic, dynamic> f = null, object parameters = null)
{
    parameters = new ExpandoObject().CopyFromSafe(parameters);
    if (spName != SPMAP) ((dynamic)parameters).lang = this.languageCode;

    using (var db = new SqlConnection(this.connectionString))
    {
    await db.OpenAsync();

    var results = await db.ExecuteTVP(progress, spName, ids, parameters);

    db.Close();
    }

    return this.data[s];
}
4

4 に答える 4

9

メソッドが例外をスローするasyncと、その例外は返された に配置されTaskます。呼び出し元に直接発生しません。これは仕様によるものです。

そのためawaitTask返されるか、引数の例外を調べるLoadMSpecAsync必要があります。そこに現れます。mSpecCompletionHandlerTask

于 2013-03-04T14:00:44.807 に答える
1

監視されていないタスクの例外は、次のように処理できます。

TaskScheduler.UnobservedTaskException += (object sender, UnobservedTaskExceptionEventArgs eventArgs) =>
{
      eventArgs.SetObserved();
      ((AggregateException)eventArgs.Exception).Handle(ex =>
      {
          //TODO: inspect type and handle exception
          return true;
      });
};
于 2013-03-04T13:40:55.663 に答える
0

私が見つけた有用な情報があるので、私は自分の質問に答えを追加します。中間メソッド LoadMSpecAsync が例外を飲み込んでいます。これが起こらないためには、少しチークが必要です。戻り値の型の前に async キーワードを追加し、「return」の後に「await」キーワードを追加する必要があります。

于 2013-03-05T08:54:39.447 に答える