1

Ich möchte eine Datei in Blöcken zu einem Web-Service hochladen.Erstellen einer Task-Pipeline mit .NET 4?

Mit .NET 4 Aufgabe parallel Bibliothek möchte ich eine Datei, ein Stück nach dem anderen hochladen.

Ich habe die Byte-Stücke auf dem Client bekam, und ich kann jeden laden einfach gut:

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

jedoch, dass uploads alle gleichzeitig Brocken. Ich möchte jedes Stück nacheinander hochladen. Eine Pipeline, wenn Sie so wollen.

Wie kann ich dies mit .NET 4 Task Parallel Library tun?

+0

Vielleicht wäre "eine Aufgabe nach der anderen in Silverlight" wäre ein besserer Titel. –

Antwort

3

Sie benötigen die TPL nicht. Ändern Sie den Methodenaufruf in webService.UploadFile (...). Was Sie versuchen, ist synchron ein Stück nach dem anderen hochzuladen. Warum brauchst du eine Pipeline?

+0

Ich möchte das asynchron nacheinander machen. Ich möchte UploadFile nicht aufrufen, da dies die Benutzeroberfläche blockieren würde. –

+0

Nicht sicher, was WebService ist. Wenn Sie können, lassen Sie den Fortschritt jedes N Byte hochsenden (z. B. ProgressChanged-Ereignis) und laden Sie die gesamte Datei gleichzeitig in eine Async-Anfrage hoch. Mit anderen Worten, lass es sich mit dem Chunking beschäftigen. Wenn dies keine Option ist, legen Sie den Code (mit webService.UploadFile (...)) in eine Aktion und planen Sie ihn mit BackgroundWorker in einem Hintergrundthread. –

+0

Leider ist dies Silverlight, es gibt keinen blockierenden Anruf. Und ja, TPL ist für Silverlight über einige CTP-Bits verfügbar. Mit anderen Worten, ich kann die synchrone Version nicht aufrufen, weil es keine gibt. –

4

Anstatt die TPL zu verwenden, würde ich empfehlen, eine BackgroundWorker zu verwenden, die für genau diese Art von Szenario entwickelt wurde (Ausführen von Arbeiten im Hintergrund einer GUI-Anwendung). Ich würde dann die synchrone Version UploadFile aufrufen. Mit der Klasse BackgroundWorker können Sie z. B. den Fortschritt des Berichts protokollieren und den Vorgang gegebenenfalls abbrechen.

+0

+1! Ironischerweise habe ich das gleiche in einem Kommentar zu meiner ursprünglichen Antwort geschrieben. –

0

Sie können das Ereignis UploadFileAsyncCompleted dafür verwenden.

Starten Sie den ersten asynchronen Chunk-Upload. Und dann muss der UploadFileAsyncCompleted Event-Handler mit dem nächsten fortfahren. Ungefähr, das:

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

Verwenden einer parallelen Bibliothek, um Dinge sequenziell zu tun, ist wahrscheinlich nicht die beste Idee. F # und C# 5 CTP haben beide sehr gute asynchrone Programmiermodelle - aber wenn Sie nicht in der Lage sind, diese zu verwenden, müssen Sie einfach auf das UploadFileAsyncCompleted Ereignis warten, bevor Sie mit dem Hochladen des nächsten Chunks beginnen.