очередь задач на WinRT

Рейтинг: 1Ответов: 1Опубликовано: 22.04.2015

Здравствуйте! Поставил себе задачу, а грамотно объяснить гуглу что хочу - не могу.

Нужно под WinRT реализовать очередь задач - объект, выполняющий задачи одну за другой. Есть несколько паралельно выполняющихся потоков. Потоки выполняют однотипные задачи - читают или записывают данные в файл. Потоки должны добавлять в очередь свои задачи и ожидать их выполнения.

Пока что представляю себе это так: поток добавляет в очередь что-то вроде IAsyncOperation, и ждет ее выполнения. Очередь выполняет добавленные задачи, выполненные задачи удаляются из очереди.

Кто-нибудь знает, есть ли уже реализация подобных вещей? Или в какую сторону смотреть если придется писать это самому?

Ответы

▲ 1

Судя по всему, вам нужен producer-consumer.

Это делается так:

readonly BlockingCollection<YourTask> q = new BlockingCollection<YourTask>();

// добавление 
while (есть ещё задания)
{
    YourTask t = new YourTask(...);
    q.Add(s);
}

q.CompleteAdding();

Исполнитель выглядит так:

var consumerThreads = new List<Thread>();
for (int i = 0; i < consumerCount; i++)
{
    Thread t = new Thread(() => Consumer(q));
    t.Start();
    consumerThreads.Add(t);
}

void Consumer(BlockingCollection<YourTask> q)
{
    foreach (var t in q.GetConsumingEnumerable())
    {
        // выполнить задание t
    }
}