0

У меня есть следующий код в 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 не вызывается. Как я могу получить его для распространения исключения?

Примечание: Я скопировал код вручную на мой телефон, так что могут быть ошибки компиляции ...

ответ

2

Я достаточно уверен, что вместо

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 после того, как сделаете все, что хотите, за исключением.

+0

Это сработало! Благодарю. – user6251216

Смежные вопросы