今後の更新: 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];
}