Я использую методы async fire-and-forget, используя void как возвращаемое значение, но НЕ заботьтесь об исключениях.
Кажется, что консенсус исключение не может быть правильно обработано с ожиданием async, если ссылка на контрольную задачу не выполняется, и void должен быть... ну.. избегать..
Что мне не хватает в следующем коде, который, по-видимому, выполняет эту работу:
class Program
{
static void Main()
{
var p = new Processor();
p.ExceptionThrown += p_ExceptionThrown;
for (var i = 0; i < 10; i++)
p.ProcessAsync(i);
Console.ReadKey();
}
static void p_ExceptionThrown(object sender, Exception e)
{
Console.WriteLine("Exception caught in Main : " + e);
}
}
class Processor
{
public async void ProcessAsync(int iteration)
{
try
{
await Task.Run(() => Process(iteration));
}
catch (Exception e)
{
OnException(e);
}
}
public void Process(int iteration)
{
Thread.Sleep(500);
if(iteration == 5)
throw new Exception("AUUCH");
}
public event EventHandler<Exception> ExceptionThrown;
void OnException(Exception e)
{
var handler = ExceptionThrown;
if (handler != null)
handler(this, e);
}
}