我在while
循环中有以下代码:
Task worker =
Task.Factory
.StartNew(() =>
{
ProduceAsync(param, tokenSource.Token);
}, tokenSource.Token)
.ContinueWith((t) =>
{
OnException(t);
}, TaskContinuationOptions.OnlyOnFaulted);
ProduceAsync
看起来像这样:
private async Task ProduceAsync( List<string> param, CancellationToken token)
{
token.ThrowIfCancellationRequested();
var task = _requestManager.GetProductsAsync(param);
var products;
try
{
products = await task;
_products.Add(products);
}
catch
{
task.GetAwaiter().GetResult();
}
}
当异步请求中出现异常时,我希望程序快速失败,因此在OnException(t)
上,我将使用tokenSource
取消任务。这里的问题是ProduceAsync
没有传播异常,并且OnException
没有被调用。如何让它传播异常?
注意:我手动将代码复制到手机上,因此可能存在编译错误。。。
我有理由相信
Task.Factory.StartNew(() => {
ProduceAsync(param, tokenSource.Token);
}, tokenSource.Token)
.ContinueWith(...
你应该做:
Task.Run(async () => {
await ProduceAsync(param, tokenSource.Token);
}, tokenSource.Token)
.ContinueWith(...
基本上,如果您不等待异步方法完成,那么它将单独运行,并且您传递给Task.Factory.StartNew
的委托将立即返回。此外,您应该使用Task.Run
,因为它更安全一些。
此外,在对异常执行任何操作后,您可能希望在catch块中使用throw
进行重新抛出。