1

ファイルをチャンク単位で Web サービスにアップロードしたいと考えています。

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

.NET 4 タスク並列ライブラリを使用して、一度に 1 つのチャンクでファイルをアップロードしたいと考えています。

クライアントにバイトチャンクがあり、それぞれを問題なくアップロードできます。

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

ただし、それはすべてのチャンクを同時にアップロードします。各チャンクを次々にアップロードしたい。必要に応じて、パイプライン。

.NET 4 タスク並列ライブラリでこれを行うにはどうすればよいですか?

4

4 に答える 4

4

TPL を使用する代わりに、BackgroundWorkerまさにこの種のシナリオ (GUI アプリケーションのバックグラウンドで作業を実行する) 用に設計された を使用することをお勧めします。次に、UploadFile で同期バージョンを呼び出します。このBackgroundWorkerクラスを使用すると、必要に応じて進行状況を報告したり、操作をキャンセルしたりできます。

于 2010-12-21T19:16:14.930 に答える
3

TPL は必要ありません。メソッド呼び出しを webService.UploadFile(...) に変更します。あなたがやろうとしているのは、次々と同期的にアップロードすることです。なぜパイプラインが必要なのですか?

于 2010-12-21T19:09:26.737 に答える
0

UploadFileAsyncCompletedそのためにイベントを使用できます。

最初の非同期チャンク アップロードを起動します。そして、UploadFileAsyncCompletedイベント ハンドラーに次の処理を実行させます。おおよそ、これは:

int chunksSent = 0;
webService.UploadFileAsyncCompleted += delegate
{
    chunksSent++;
    if(chunksSent < chunks.Count)
        webService.UploadFileAsync(..., chunk[chunksSent], ...);
};
webService.UploadFileAsync(..., chunk[0], ...);
于 2010-12-21T19:34:26.560 に答える
0

並列ライブラリを使用して順番に実行することは、おそらく最良のアイデアではありません。F# と C# 5 CTP はどちらも非常に優れた非同期プログラミング モデルを備えていますが、それらを使用する立場にない場合はUploadFileAsyncCompleted、次のチャンクのアップロードを開始する前にイベントが発生するのを待つ必要があります。

于 2010-12-21T19:37:50.920 に答える