Просто заметили странную вещь: поймать исключение в вызывающем абоненте из новой задачи, лямбда ДОЛЖНА быть отмечена как async !? Действительно ли это необходимо, даже если у делегата нет ожидающих операторов?Обработка исключений за пределами задачи
try
{
//Task.Run(() => // exception is not caught!
Task.Run(async() => // unnecessary async!?!
{
throw new Exception("Exception in Task");
}).Wait();
}
catch (Exception ex)
{
res = ex.Message;
}
Почему существует необходимость для оператора async? Вся документация, которую я могу найти, говорит о том, что делегат не должен возвращать Void, и задача должна быть ожидаемой для исключения, чтобы распространить вызов до вызывающего.
Добавлен полный код:
class Program
{
static void Main(string[] args)
{
var p = new Program();
p.Run();
}
public void Run()
{
string result;
try
{
result = OnSomeEvent((s, ea) => RunSomeTask());
}
catch (Exception ex) // Try to catch unhandled exceptions here!
{
result = ex.Message;
}
Console.WriteLine(result);
Console.ReadKey();
}
// Some other Framework bult-in event (can not change signature)
public string OnSomeEvent(EventHandler e)
{
e.Invoke(null, new EventArgs());
return "OK";
}
private async Task RunSomeTask()
{
await Task.Run(async() => // do not need async here!!!
//await Task.Run(() => // caller do not catches exceptions (but must)
{
throw new Exception("Exception in Task1");
});
}
}
Так qestion это как catche отл. без asyn ключевое слово ???
Вам не нужно использовать 'async' - я подозреваю, что исключение исключает прерывание вывода типа делегата. Попробуйте явно указать тип делегата. – Lee
Вы говорите * исключение не поймали! * Когда асинхронный режим не используется. Но на самом деле это поймано. Это ваш фактический код? –
@ Ли верно. Я помню, как несколько месяцев назад читал дубликат по этой точной теме. Выбрасывание исключения изменяет тип возврата анонимного делегата. –