Исключение пузыря из Task.Run () - PullRequest
0 голосов
/ 21 марта 2019

У меня есть код ниже, и я пытаюсь всплыть исключение, выходящее из testFunction (). Когда я пытаюсь запустить код, исключение не выдается.

testFunction - это задача, которую я хочу вызывать через регулярные интервалы

Однако, если я явно добавлю throw new CustomException (); внутри Task.Run код выдает правильно. Я не могу понять это поведение. Я не могу ждать или ждать Task.Run, потому что я хочу, чтобы task.Run запускался самостоятельно, поэтому я использую ContinueWith, но continueWith не перехватывает исключение и, следовательно, не выбрасывает его. Посоветуйте, пожалуйста, что мне здесь не хватает?

public class Example
{

   public static CancellationTokenSource source = new CancellationTokenSource();
   public static void Main()
   {
       Console.WriteLine("Hello start");
       Task.Run(async () => 
       {

           while(token.IsCancellationRequested)
           {
               token.ThrowIfCancellationRequested();
               await testFunction(source.Token); 
               await Task.Delay(1000,token);                   
           }
                       
       } ).ContinueWith((t) =>
                        {                                
                           if (t.Exception != null) throw t.Exception;
                        });
   }
      
   public static async Task testFunction(CancellationToken token)
   {
       throw new CustomException();

   }
}

1 Ответ

0 голосов
/ 23 марта 2019

Я НЕ МОЖУ ждать или ждать Task.Run, потому что я хочу, чтобы Task.Run запускался независимо самостоятельно

Вы должны использовать await для наблюдения исключения.Вы не должны использовать await сразу же.Вы можете сохранить Task в переменной и await позже, если хотите.

, следовательно, я использую ContinueWith

ContinueWith и не собираюсьделать то, что async / await не может сделать.ContinueWith тебе не поможет. На самом деле его почти никогда не следует использовать .

Я пытаюсь всплыть исключение, полученное из testFunction ().

Позвольте мне перевернуть это: к чему приведет исключение ?Где это пузырится до ? Какая часть кода будет соблюдать это исключение ?После того, как вы ответите на этот вопрос, вы найдете, где поставить свой await.

...