[英]Catch and propagate exceptions in async methods
我在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
使其更安全。
此外,您可能需要做一個重新拋出throw
你以后要與異常無論在你的catch塊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.