Недавно я слышал несколько подкастов о TPL в .NET 4.0. Большинство из них описывают фоновые действия, такие как загрузка изображений или выполнение вычислений, используя задачи, чтобы работа не мешала потоку GUI.
Большая часть кода, над которым я работаю, имеет более сложный вид с несколькими производителями / одним потребителем, где рабочие элементы из нескольких источников должны быть поставлены в очередь, а затем обработаны по порядку. Одним из примеров может быть ведение журнала, где строки журнала из нескольких потоков секвенируются в одну очередь для возможной записи в файл или базу данных. Все записи из любого отдельного источника должны оставаться в порядке, а записи из одного и того же момента времени должны быть «близки» друг к другу в конечном выводе.
Итак, несколько потоков, задач или чего-то еще вызывают вызов очереди:
lock( _queue ) // or use a lock-free queue!
{
_queue.enqueue( some_work );
_queueSemaphore.Release();
}
И выделенный рабочий поток обрабатывает очередь:
while( _queueSemaphore.WaitOne() )
{
lock( _queue )
{
some_work = _queue.dequeue();
}
deal_with( some_work );
}
Всегда казалось разумным выделять рабочий поток для потребительской стороны этих задач. Должен ли я писать будущие программы, используя вместо этого какую-то конструкцию из TPL? Который из? Почему?