2009-08-24 3 views
5

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

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

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

Sebastian

ответ

11

Я предполагаю, что вы можете порождать код, который нужно ждать в новом потоке. Это приведет к тому, что обработчик события не будет блокировать поток, на котором возникают события, чтобы он мог вызвать следующий обработчик событий в строке. (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 
    }); 
} 
+0

Что делать, если аргументы (SomeEventArgs) содержат любые выходные параметры? Метод не может выйти до тех пор, пока не будут вычислены выходные параметры ... Я разместил связанный с этим вопрос: http://stackoverflow.com/questions/6453655/parallel-event-handling-in-c/6453701#6453701 –

2

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

+0

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

+0

Я не думаю, что в пуле потоков всегда есть созданные ранее потоки, я думаю, что они создадут их несколько раз, поэтому вы все равно заплатите эту стоимость. – vava