Некоторые из нас предпочитают кодировать в стиле исключения-света. Однако, если вы ждете задачи параллельной библиотеки задачи, и задача забросила исключение, она также вызовет исключение в вызывающем потоке. Существует ли (желательно стандартный) способ избежать такого поведения и просто проверить ответ на исключения, когда вы его вернете?Есть ли способ подождать задания TPL без исключения?
ответ
Вы можете использовать Task.WaitAny как:
var task = Task.Run(() =>
{
// ...
throw new Exception("Blah");
});
Task.WaitAny(task);
if (task.IsFaulted)
{
var error = task.Exception;
// ...
}
else if (task.IsCanceled)
{
// ...
}
else
{
// Success
}
Основываясь на том, что вы написали, можете ли вы поймать исключение и проверить свойство IsFaulted
? IsFaulted
Я пошел с Task.WaitAny подхода. Чтобы дать вам контекст для почему, вызываемый код - это код библиотеки, который я не мог изменить и вызывался из-за пределов TPL, но исключения были довольно распространены и, хотя их нужно было обрабатывать, было ужасно много шума для если вы ударили «break on exception» on, который я делаю все время. –
Поймать исключение в пределах Задачи и вернуть его в результате?
var task1 = Task.Factory.StartNew(() =>
{
try
{
throw new MyCustomException("I'm bad, but not too bad!");
}
catch(Exception ex)
{
return new Result { Error = ex };
}
});
К сожалению, эта функциональность не встроена. Используйте это решение:
myTask.ContinueWith(_ => { }, TaskCOntonuationOptions.ExecuteSynchronously).Wait();
Вы можете сделать это способом расширения.
Вы не можете ждать на поврежденную задаче, не поднимая исключение. Но вы можете ждать продолжение к этой задаче, которая будет завершить только после того, как исходная задача завершена, не поднимая исключение:
public static Task SwallowExceptions(this Task task)
{
return task.ContinueWith(_ => { });
}
faultedTask.SwallowExceptions().Wait();
if (faultedTask.IsFaulted)
{
// handle exception
}
Если ваша задача возвращает значение, вы можете представлять, что в методе расширений и возврат фактическое значение, если не было никаких исключений или значения по умолчанию, если они были:
public static Task<T> SwallowExceptions<T>(this Task<T> task)
{
return task.ContinueWith(completedTask =>
completedTask.IsFaulted
? default(T)
: completedTask.Result);
}
- 1. Есть ли способ подождать нажатия кнопок без EventHandler?
- 2. Casperjs - есть ли способ подождать n секунд?
- 3. Продолжение и исключения Tpl?
- 4. Есть ли способ заставить транзакционный откат без возникновения исключения?
- 5. Есть ли способ поймать исключения без прерывания цикла в Java?
- 6. F #: Пользовательские исключения. Есть ли лучший способ перегрузить тип исключения?
- 7. Есть ли способ подождать, пока DirectionsService вернет результаты?
- 8. Есть ли способ узнать, является ли вызывающий объект очень надежным без возможности исключения исключения?
- 9. Есть ли способ поймать эти Исключения?
- 10. Есть ли способ обнаружить разрывы в графе потока данных TPL
- 11. Есть ли способ подождать, пока актер полностью остановится?
- 12. Есть ли способ подождать после отправки сигнала процессу?
- 13. Python - Есть ли способ подождать os.unlink() или os.remove(), чтобы закончить?
- 14. Есть ли способ приостановить или подождать несколько секунд из сценария?
- 15. Подсветка: Есть ли запланированные задания?
- 16. Есть ли способ откат транзакции внутри плагина Dynamics CRM без исключения исключения?
- 17. Есть ли способ сделать своего рода TryStart для задачи в C# TPL (без блокировки)?
- 18. Есть ли F # эквивалент TPL Parallel.Invoke?
- 19. Есть ли способ узнать, были ли исключения отключены?
- 20. Есть ли способ получить исходные задания cron из файла
- 21. Есть ли способ направить Оози, чтобы убить все задания?
- 22. Стоимость задания потока данных - есть ли способ его легко получить?
- 23. Есть ли способ узнать статус задания агента SQL Server?
- 24. Есть ли способ сделать Resque распределить заданные задания одинаково?
- 25. Есть ли способ запросить статус узла перед отправкой одного задания?
- 26. Есть ли способ инициировать восходящие задания с параметрами?
- 27. Есть ли способ читать задания grunt через терминал?
- 28. Есть ли способ отправить задания в кластер с помощью bash?
- 29. Перемещение главного узла. Есть ли способ скопировать все задания?
- 30. Как подождать приглашения пользователя при вызове задания
Таким образом, в основном вы спрашиваете, вызвал ли какой-то код исключение, есть ли способ обнаружить его, не поймав его? –
Вы абсолютно уверены, что вам нужно * подождать * для задания? Я бы порекомендовал вам '.ContinueWith (...)' все, что вы сделали после вызова Wait. –
Это экземпляр, в котором вы должны использовать продолжения для опроса статуса предшествующей задачи. Продолжение является основополагающим для TPL. Избегайте взломать их. Более того, проглатывание исключений - запах кода. – Gusdor