2014-07-07 38 views
1

我正在編寫一次加載同一任務的多個實例並等待它們全部完成的代碼。每個任務都從一個文件讀取並上傳該文件一部分的字節數組。在異步任務中關閉MemoryStream

var requests = new Task[parts.Count]; 
foreach (var part in parts) 
{ 
    var partNumber = part.Item1; 
    var partSize = part.Item2; 
    var ms = new MemoryStream(partSize); 
    var bw = new BinaryWriter(ms); 

    var offset = (partNumber - 1) * partMaxSize; 
    var count = partSize; 
    bw.Write(assetContentBytes, offset, count); 

    ms.Position = 0; 
    Console.WriteLine("beginning upload of part " + partNumber); 
    requests[partNumber - 1] = uploadClient.UploadPart(uploadResult.AssetId, partNumber, ms); 
} 

await Task.WhenAll(requests); 

我想相關的任務後關閉這些MemoryStreams是完整的,但如果我寫stream.Close()進入死循環,在任務前關閉流完成。任務完成後是否可以關閉每個流?謝謝。

+0

好像'UploadPart'是同步調用。關閉ms後 –

+0

這裏是什麼'uploadClient'? –

+1

@ L.B那麼該方法返回一個'任務'。什麼讓你覺得它是同步的? – Servy

回答

10

只需提取使用流到另一個異步方法的一部分:

var requests = new Task[parts.Count]; 
    foreach (var part in parts) 
    { 
     var partNumber = part.Item1; 
     var partSize = part.Item2; 
     requests[partNumber - 1] = UploadPartAsync(partNumber, partSize); 
    } 

    await Task.WhenAll(requests); 

... 

async Task UploadPartAsync(int partNumber, int partSize) 
{ 
    using (var ms = new MemoryStream(partSize)) 
    using (var bw = new BinaryWriter(ms)) 
    { 
     var offset = (partNumber - 1) * partMaxSize; 
     var count = partSize; 
     bw.Write(assetContentBytes, offset, count); 

     ms.Position = 0; 
     Console.WriteLine("beginning upload of part " + partNumber); 
     await uploadClient.UploadPart(uploadResult.AssetId, partNumber, ms); 
    } 
} 
+0

謝謝,這很簡單。 – jahmezz