Lui*_*rao 1 c# asynchronous task-parallel-library
从未来的更新: 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();
}
}
Run Code Online (Sandbox Code Playgroud)
这是LoadMSpecAsync的代码
public Task<ResultSet> LoadMSpecAsync(IProgress<int> prg,
IEnumerable<string> ids)
{
return this.LoadAsync(prg, ids, Selector.M, SPMS, x => x.Order);
}
Run Code Online (Sandbox Code Playgroud)
下面是LoadAsync的代码,等待db.ExecuteTVP(progress,spName,id,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];
}
Run Code Online (Sandbox Code Playgroud)
当async方法抛出异常时,该异常将放在返回的异常上Task.它不是直接向调用者提出的.这是设计的.
所以,你必须要么await在Task从返回LoadMSpecAsync或者让你mSpecCompletionHandler检查它的Task例外参数.它会出现在那里.