Взгляните на System.Collections.Concurrent Пространство имен - есть реализация потоковобезопасной очереди, а именно. ConcurrentQueue - хотя, я подозреваю, что ваши нужды будут лучше обслуживаться BlockingCollection .
Блокирующая коллекция - это, по сути, потокобезопасная коллекция, полезная для сценария производитель-потребитель. В вашем случае вызовы WCF будут выступать в качестве производителей, которые будут добавлять в коллекцию, в то время как рабочий поток будет выступать в роли потребителя, который, по сути, будет брать задачи из коллекции из очереди. Используя одного потребителя (и коллекции), вы можете обеспечить порядок выполнения. Если это не важно, то вы можете использовать несколько пользовательских потоков. (Существуют также AddAny
и TakeAny
статические перегрузки, которые позволят вам использовать несколько коллекций (несколько очередей), если это необходимо.)
Преимущество по сравнению с while(true)
заключается в избежании замкнутого цикла, который будет просто потреблять циклы ЦП. Помимо обеспечения безопасности потока это также решило бы проблему синхронизации между очередями и потоками вывода из очереди.
EDIT
Blocking Collection действительно очень прост в использовании. Ниже приведен простой пример - добавление задачи будет вызвано, скажем, вашими методами WCF для постановки в очередь задач, в то время как StartConsumer
будет вызываться во время запуска службы.
public class MyTask { ... }
private BlockingCollection<MyTask> _tasks = new BlockingCollection<MyTask>();
private void AddTask(MyTask task)
{
_tasks.Add(task);
}
private void StartConsumer()
{
// I have used a task API but you can very well launch a new thread instead of task
Task.Factory.StartNew(() =>
{
while (!_tasks.IsCompleted)
{
var task = _tasks.Take();
ProcessTask(task);
}
});
}
При остановке службы необходимо вызвать _tasks.CompleteAdding
, чтобы потребительский поток прервался.
Найти больше примеров на MSDN:
http://msdn.microsoft.com/en-us/library/dd997306.aspx
http://msdn.microsoft.com/en-us/library/dd460690.aspx
http://msdn.microsoft.com/en-us/library/dd460684.aspx