Создание конвейера задач с .NET 4? - PullRequest
1 голос
/ 21 декабря 2010

Я хочу загрузить файл кусками в веб-сервис.

// Web service method:
void UploadFile(int fileId, byte[] chunk, int position, bool complete);

Используя параллельную библиотеку задач .NET 4, я хочу загрузить файл по одному фрагменту за раз.

У меня есть куски байтов на клиенте, и я могу отлично загрузить каждый из них:

List<byte[]> chunks = ...;
webService.UploadFileAsyncCompleted += OnChunkUploaded;
foreach (var chunk in chunks)
{
   webService.UploadFileAsync(...);
}

Однако, это загружает все порции одновременно. Я хочу загрузить каждый кусок, один за другим. Трубопровод, если хотите.

Как я могу сделать это с параллельной библиотекой задач .NET 4?

Ответы [ 4 ]

4 голосов
/ 21 декабря 2010

Вместо использования TPL, я бы порекомендовал использовать BackgroundWorker, который был разработан именно для такого сценария (выполнение работы в фоновом режиме приложения с графическим интерфейсом).Затем я бы вызвал синхронную версию до UploadFile.Класс BackgroundWorker позволяет вам делать такие вещи, как отчет о прогрессе и отменить операцию, если вам нужно.

3 голосов
/ 21 декабря 2010

Вам не нужен TPL.Измените вызов вашего метода на webService.UploadFile (...).То, что вы пытаетесь сделать, - это синхронно загружать один фрагмент за другим.Зачем тебе трубопровод?

0 голосов
/ 21 декабря 2010

Использование параллельной библиотеки для последовательных действий, вероятно, не лучшая идея.F # и C # 5 CTP оба имеют действительно хорошие модели асинхронного программирования - но если вы не в состоянии использовать их, вам просто придется подождать, пока не наступит событие UploadFileAsyncCompleted, прежде чем вы начнете загружать следующий блок.

0 голосов
/ 21 декабря 2010

Для этого можно использовать событие UploadFileAsyncCompleted.

Запустите первую асинхронную загрузку чанка. Затем обработчик события UploadFileAsyncCompleted перейдет к следующему. Грубо говоря, это:

int chunksSent = 0;
webService.UploadFileAsyncCompleted += delegate
{
    chunksSent++;
    if(chunksSent < chunks.Count)
        webService.UploadFileAsync(..., chunk[chunksSent], ...);
};
webService.UploadFileAsync(..., chunk[0], ...);
...