2013-11-29 3 views
1

У меня есть приложение Windows, построенное на .net-технологии. В моем приложении я получаю много сообщений из разных потоков. Как только я получаю сообщение, мне нужно вызвать функцию, которая должна быть потокобезопасной. Я использовалОчередь сообщений против блокировки потоков

lock (lockThis) 
     { 
      TSFunction(message); 
     } 

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

+3

Вызов вашей функции внутри 'lock' не делает функцию потоком безопасной. Также очередь сообщений не делает ничего по существу безопасным потоком. Единственное, что можно надежно сделать потокобезопасным, это * контент * метода, а не так, как вы его называете. В любом случае, попросив StackOverflow, следует ли вам переключаться, предполагает слишком много знаний вашей системы от нашего имени (мы не знаем, каковы ваши более широкие требования!), А также во многих случаях является довольно субъективным вопросом. –

ответ

1

С вашей текущей конструкцией, всякий раз, когда вы обрабатываете сообщение, другие потоки полностью блокируются. Если это не проблема, то кого это волнует, не так ли?

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

Будьте осторожны: обработка сообщений будет несинхронизирована. Так, например, если обработка сообщений медленная, тогда поток может отправлять несколько сообщений до того, как они будут обработаны. Вам решать, разрешать ли вы это. Это фактически делает ваше приложение менее потокобезопасным, в то время как оно может работать лучше (меньше времени ожидания).

Вы даже можете обрабатывать сообщения в пуле потоков, обрабатывать несколько сообщений параллельно и т. Д. Параметры бесконечны.

+0

Зависит от шаблонов блокировки в этих других потоках. –

Смежные вопросы