簡體   English   中英

在異步方法中捕獲並傳播異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM