Потоковая обработка событий (C#)

У меня есть вопрос об обработке событий с помощью C#. Я слушаю события, которые бросает класс А. Теперь, когда событие вызывается, выполняется метод, который что-то делает. Этот метод иногда должен ждать ответов от источников данных или подобных.

Я думаю, что обработка событий синхронна, поэтому события будут обрабатываться одно за другим. Можно ли сделать это асинхронным? Я имею в виду, что когда метод выполняется, но должен ждать ответа источника данных, может быть обработано другое событие?

заранее спасибо

Себастьян


person Sebastian Müller    schedule 24.08.2009    source источник


Ответы (2)


Я предполагаю, что вы можете создать код, который должен ожидать в новом потоке. Это приведет к тому, что обработчик событий не будет блокировать поток, в котором возникают события, чтобы он мог вызвать следующий обработчик событий в очереди. (пример C# 3.5)

private void MyPotentiallyLongRunningEventHandler(object sender, SomeEventArgs e)
{
    ThreadPool.QueueUserWorkItem((state) => {
        // do something that potentially takes time

        // do something to update state somewhere with the new data
    });
}
person Fredrik Mörk    schedule 24.08.2009
comment
Что делать, если аргументы (SomeEventArgs) содержат какие-либо выходные параметры? Метод не может уйти, пока выходные параметры не будут вычислены... Я разместил здесь связанный вопрос: stackoverflow.com/questions/6453655/ - person Kill KRT; 27.06.2011

Просто создайте поток в своем обработчике событий и выполните всю логику там. Лучше использовать пул потоков, чтобы количество потоков было ограничено.

person vava    schedule 24.08.2009
comment
Создание потока недешево, так что это, вероятно, не будет хорошей идеей для обработчика событий, но вы можете использовать пул потоков, как вы говорите. - person Brian Rasmussen; 24.08.2009
comment
Я не думаю, что в пуле потоков всегда есть предварительно созданные потоки, я думаю, что он будет создавать их первые несколько раз, поэтому вы все равно заплатите эту стоимость. - person vava; 24.08.2009