Очередь асинхронных операций? - PullRequest
0 голосов
/ 08 февраля 2011

Я использую библиотеку c # COM, которая обеспечивает асинхронный механизм (на самом деле это PDFCreator, навязанный моим клиентом). Преобразование файла документа в файл PDF требует двух вещей:

  • a PrintFile метод, который запускает преобразование
  • a ready событие, указывающее, что преобразование завершено

[Edit]: Не существует методов Begin / End асинхронных шаблонов. Я должен запустить метод printfile и ждать, пока событие будет вызвано

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

Как мне управлять очередью файлов для конвертации?

Я бы хотел, чтобы мое приложение (приложение WPF) просто "ставило в очередь" файл для преобразования .... Затем мой рабочий объект удалял файлы из очереди по очереди, обеспечивая одновременное выполнение только одного преобразования.

Обратите внимание, что я использую C # 4, и я бы хотел (потому что я учусь) использовать Задачи, если это преимущество.

1 Ответ

0 голосов
/ 08 февраля 2011

Если PDFCreator предоставляет интерфейс на основе APM (т. Е. Методы BeginFoo / EndFoo), вы можете заключить эти методы в задачу:

Task<int> bytesRead = Task<int>.Factory.FromAsync( 
    stream.BeginRead, stream.EndRead, buffer, 0, buffer.Length, null);  

, здесь есть статья: http://blogs.msdn.com/b/pfxteam/archive/2009/06/09/9716439.aspx, котораяБолее подробно это объясняется.

Если у вас есть группа задач, вы можете запустить их в очередь с помощью настраиваемого TaskScheduler или по умолчанию: (http://msdn.microsoft.com/en-us/library/dd997402.aspx), похоже, что вы можете использовать планировщик задач по умолчанию вваш сценарий.

task.Start()

Примечание: если вы хотите, чтобы эти задачи уведомляли пользовательский интерфейс о завершении, вы можете использовать продолжение (http://msdn.microsoft.com/en-us/library/dd270696.aspx), которое может уведомить пользовательский интерфейс о завершении задачи. Примечаниечтобы выполнить маршалинг обратно в поток пользовательского интерфейса, вам нужно использовать SynchronizationContext или Dispatch.BeginInvoke.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...