2009-11-30 4 views
1

Я очень новичок в многопоточном программировании. Ниже я пытаюсь достичь:C# - Очередь и многопоточность

  • Создание службы окон, которые непрерывно считывает базу данных (или somekind из очереди сообщений, пожалуйста, предложить то, что было бы лучше) для записи в таблице.
  • Посмотрите на новую запись в таблице
  • Если есть новая запись, проверьте, достаточно ли нить в ThreadPool (не уверен, как это будет работать), начать новую тему и сделать некоторые Работа. Во время большого трафика может быть много новых записей, поэтому мне нужно иметь многопоточность.

Спасибо всем. Пожалуйста, помогите мне с идеями и ссылками. Я ценю вашу помощь.

+0

Если вы используете очередь сообщений, а не таблицу базы данных, рассмотрите ли вы сообщение о очереди как «новую запись» или это конкретное значение, которое может содержать сообщение, которое вы ищете? –

+0

Сообщение о очереди будет новой записью. Кроме того, новая запись будет удалена из очереди сообщений, если она успешно обработана. – Emon

ответ

2

Если возможно, вы можете захотеть, чтобы сигналы отправки базы данных были изменены. Непрерывные чтения выглядят как обратный дизайн. Если вы не хотите создавать свой собственный сервис, вы можете использовать Службы планирования Windows, чтобы запустить приложение для чтения базы данных. Вы бы не смогли использовать ThreadPool, чтобы ограничить количество одновременных действий. Но если вы создаете свой собственный сервис, использование класса ThreadPool довольно прямолинейно. Вы можете просто установить ограничение потока и сохранить рабочие элементы queuing на основе обновлений базы данных. Также играйте с SetMinThreads, чтобы поддерживать поток и повторно использовать его.

0

Если вы используете SQL Server, вы можете использовать SqlCacheDependency Class для мониторинга изменений в базе данных.

1

Все, что вам понадобится, это ThreadPool и MSMQ (простите ссылку на статью VB.NET); очень тривиально. То, что вы написали в своем примере, - это опрос, а не очередь, технически.

1

Где эта таблица обновляется и почему?

Если вы просто используете эту таблицу в качестве способа «общения» между двумя приложениями, я бы предложил использовать систему EMS, такую ​​как MSMQ. Вы можете заставить ваши 2 приложения разговаривать друг с другом и иметь всю гарантированную доставку, которая поставляется с MSMQ. Он также запекается в WCF и довольно легко интегрируется.

Если эта таблица обновляется для какой-либо другой цели (например, вы не пытаетесь создать собственную систему очередей), то я согласен с Rashmi в рекомендации SqlCacheDepdency. Это, по сути, позволит вам привязать ваш код .NET к SQL, чтобы событие было поднято при добавлении новой записи в таблице или обновлении существующей (или что-то изменит набор результатов в этом отношении).

0

Как говорили другие, вам, вероятно, лучше всего будет пользоваться MSMQ. Я бы сделал шаг дальше и предложил вам написать свою службу с помощью WCF и развернуть ее в IIS. Это не совсем просто, но Microsoft уже сделала большую часть работы, которую вы хотели бы сделать.

Том Холландер имеет большую серию статей о настройке MSMQ, WCF и IIS здесь:

http://blogs.msdn.com/tomholl/archive/2008/07/12/msmq-wcf-and-iis-getting-them-to-play-nice-part-1.aspx

1

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

Я создаю отдельные потоки для каждого процесса и отслеживаю количество активных потоков, что позволяет мне регулировать «на лету». Поскольку каждый поток вызывает вызов веб-службы, было незначительное преимущество от использования threadpool, и это также позволило мне начать много потоков, поскольку они заблокировали ожидание на внешнем сервере.

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

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

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

Но у меня был взрыв, создающий это, и я надеюсь, что и вы это сделаете.

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