更新: TL; DR趕上你要await
,Task.WaitAll
,或.Result
異步方法表達式。異步異常捕獲或者被吞噬從未來
我創建了一個稍微複雜的異步方法,只是運行其他異步方法。你可以忽略它的大部分,因爲只有var mSpekTask這一行是有意義的,我也不關心邏輯,我只想知道我的異常去了哪裏。我的主要問題是ex.ToString()從來沒有命中,即使mSpecTask內部發生了異常。
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代碼,等待db.ExecuteTVP(進展,spName,IDS,參數)生成異常。
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];
}
如果我們可以忽略它的大部分,爲什麼你把它放在首位?請僅張貼相關部分。更好:創造一個簡短,乾淨的複製品。 – 2013-03-04 13:41:01