2017-08-24 8 views
3

私は次の2つのサンプルを持っています。最初のものが終わると、2番目のものは最初の結果を使うべきです。私は、誰かがそれをチェーンにどのように私を導いた場合いただければ幸いです。このフィールドIIで新しいです:チェーンを続ける

public async Task<string> UploadFile(string containerName, IFormFile file) 
    { 
     //string blobPath = ""; 
     var container = GetContainer(containerName); 
     var fileName = file.FileName; 
     CloudBlockBlob blob = container.GetBlockBlobReference(fileName); 
     using (var memoryStream = new MemoryStream()) 
     { 
      // await file.CopyToAsync(memoryStream); 
      // await blob.UploadFromStreamAsync(memoryStream); 

      // upload only when the 'memoryStream' is ready 
      Task.Factory.StartNew(() => file.CopyToAsync(memoryStream)) 
       .ContinueWith(m => blob.UploadFromStreamAsync(m.Result)); // ?? 
     } 
     return blob.Uri.AbsoluteUri; 
    } 

第二の変形されていない場合:

public string UploadFile(string containerName, IFormFile file) 
{ 
    var container = GetContainer(containerName); 
    var fileName = file.FileName; 
    CloudBlockBlob blob = container.GetBlockBlobReference(fileName); 
    using (var memoryStream = new MemoryStream()) 
    { 
     file.CopyToAsync(memoryStream).Wait(); 
     blob.UploadFromStreamAsync(memoryStream).Wait(); 

     //Task.Factory.StartNew(() => file.CopyToAsync(memoryStream)) 
     // .ContinueWith(m => blob.UploadFromStreamAsync(m.Result)); // ?? 
    } 
    return blob.Uri.AbsoluteUri; 
} 
+2

memoryStreamのライフサイクルに注意してください。最初のタスクが完了する前に処分されます。 – GhostTW

答えて

3

IFormFileからのストリームを取得し、直接

それをアップロード
public async Task<string> UploadFile(string containerName, IFormFile file) 
{ 
    //string blobPath = ""; 
    var container = GetContainer(containerName); 
    var fileName = file.FileName; 
    CloudBlockBlob blob = container.GetBlockBlobReference(fileName); 
    await blob.UploadFromStreamAsync(file.OpenReadStream()) 
    return blob.Uri.AbsoluteUri; 
} 
+0

はうまく動作しますが、私の変種では 'blob.UploadFromStreamAsync(file.OpenReadStream())。Wait();'ありがとう、この場合にどのように使用するのかを説明できますか? – Serge

+2

@Serge非同期/待機とブロック呼び出し( '.Result'または' .Wait() ')を混ぜてデッドロックを取得する危険性があります。コードが非同期的に流れて – Nkosi

+2

@Sergeになるようにしましょう。ほとんどの場合、ContinueWithは使用しないでください。 – mason

関連する問題