Агрегировать и пересылать исключения из нескольких потоков - PullRequest
1 голос
/ 16 марта 2012

В моем методе я запускаю несколько потоков, а затем жду, пока они закончат свою работу (что-то вроде шаблона fork-join).

using (var countdownEvent = new CountdownEvent(runningThreadsCount))
{
    for (int i = 0; i < threadsCount; i++)
    {
        var thread = new Thread(new ThreadStart(delegate
                                                {
                                                   // Do something
                                                   countdownEvent.Signal(); 
                                                }));

        thread.Start();
    }

    countdownEvent.Wait();
}

Теперь мне нужно иметь возможность перехватить исключение в этих потоках (допустим, что // Do something может вызвать исключение), передать исключение в основной поток, разблокировать его (так как оно ожидает countdownEvent) и повторно брось исключение.

Какой самый элегантный способ добиться этого?

1 Ответ

1 голос
/ 16 марта 2012

Решил мою проблему с помощью Задачи API . Спасибо flq за предложение!

var cancellationTokenSource = new CancellationTokenSource();
var tasks = new Task[threadsCount]
for (int i = 0; i < threadsCount; i++)
{
    tasks[i] = Task.Factory.StartNew(
        delegate
            {
                // Do something
            }, cancellationTokenSource.Token);
}

try
{
    Task.WaitAll(tasks);
}
catch (AggregateException ae)
{
    cancellationTokenSource.Cancel();
    throw ae.InnerExceptions[0];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...