Параллельная обработка событий в C # - PullRequest
2 голосов
/ 23 июня 2011

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

Вот пример моего кода:

void Init()
{
   provider.OnNewMessage += new OnMessageEventHandler(processEvent);
}

void processEvent(string xml, int …, out string resultXML, out string description)
{
   ...
}

Какой лучший подход для этого в C # 3.5?

Спасибо

Ответы [ 2 ]

5 голосов
/ 23 июня 2011

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

0 голосов
/ 23 июня 2011

Вот модифицированный ответ:

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

Я предлагаю вам использовать WCF .WCF имеет шаблон сообщения запроса / ответа, где одна конечная точка запрашивает данные от второй конечной точки.Вторая конечная точка отвечает.WCF - такая большая тема, и мне жаль, что я не могу погрузиться в детали здесь.Но вы могли бы легко начать с этого видео .А вот больше видео для вас.

==================== ниже приведен старый ответ ===================

Вы можете начать новый поток для каждого события:

void processEvent(string xml, int …, out string resultXML, out string description)
{
   new Thread(Handler).Start(xml);
}

void Handler(object xml)
{
    //do the actual work here
}

Каждый запрос вызывающего будет немедленно получен ответом потока,так что абонент не будет заблокирован.И каждый поток автоматически завершит работу после завершения обработки запроса, поэтому в вашей системе не будет слишком много потоков.

Это просто простое решение.Возможно, вы захотите рассмотреть пул потоков для повышения производительности.

...