Недавно я слышал кучу подкастов о TPL в .NET 4.0. Большинство из них описывают фоновые действия, такие как загрузка изображений или выполнение вычислений, использование задач, чтобы работа не мешала потоку графического интерфейса.
Большая часть кода, над которым я работаю, имеет больше разновидностей нескольких производителей/одного потребителя, где рабочие элементы из нескольких источников должны быть поставлены в очередь, а затем обрабатываться по порядку. Одним из примеров является ведение журнала, где строки журнала из нескольких потоков секвенируются в одну очередь для последующей записи в файл или базу данных. Все записи из любого источника должны оставаться в порядке, и записи с одного и того же момента времени должны быть "близки" друг к другу в конечном результате.
Таким образом, несколько потоков или задач или что-то еще вызывают queuer:
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? Который из? Почему?