2013-02-27 241 views
3

我有一種方法將一個文件上傳到服務器。現在正在工作,除了方法上的任何不好的編碼(Im新任務庫)。任務繼續執行多個任務

這裏是文件上載到服務器的代碼:

private async void UploadDocument() 

{ 
    var someTask = await Task.Run<bool>(() => 
    { 
     // open input stream 
     using (System.IO.FileStream stream = new System.IO.FileStream(_cloudDocuments[0].FullName, System.IO.FileMode.Open, System.IO.FileAccess.Read)) 
     { 
      using (StreamWithProgress uploadStreamWithProgress = new StreamWithProgress(stream)) 
      { 
       uploadStreamWithProgress.ProgressChanged += uploadStreamWithProgress_ProgressChanged; 

       // start service client 
       SiiaSoft.Data.FieTransferWCF ws = new Data.FieTransferWCF(); 

       // upload file 
       ws.UploadFile(_cloudDocuments[0].FileName, (long)_cloudDocuments[0].Size, uploadStreamWithProgress); 

       // close service client 
       ws.Close(); 
      } 
     } 

     return true; 

    }); 

} 

然後我有一個列表框,我可以拖動&中的多個文件所以我想要做的就是到ListBox中做一個for循環文件,然後撥打電話UploadDocument();,但我想先上傳listBox中的第一個文件,然後完成後繼續第二個文件等等...

任何線索的最佳方法呢?

非常感謝。

回答

9

您應該讓您的UploadDocument返回Task。然後你可以等待循環中的任務。例如:

private async Task UploadAllDocuments() 
{ 
    string[] documents = ...; // Fetch the document names 

    foreach (string document in documents) 
    { 
     await UploadDocument(document); 
    } 
} 

private async Task UploadDocument(string document) 
{ 
    // Code as before, but use document instead of _cloudDocuments[0] 
} 

事實上,你的UploadDocument可製成反正簡單:

private Task UploadDocument() 
{ 
    return Task.Run<bool>(() => 
    { 
     // Code as before 
    }); 
} 

包裝,在一個async方法不是特別有用。

(您可能想將類型更改爲不string - 目前還不清楚是什麼_cloudDocuments是)

在一般情況下,你應該始終做出async方法的返回TaskTask<T>除非你以使其返回void以符合事件處理模式。

+0

我只是這樣做,一個問題..當我調用UploadAllDocuments();其下劃線爲綠色,當我懸停時,我得到:「因爲這個調用沒有等待,在調用前繼續執行當前的方法......」任何線索? – VAAA 2013-02-27 16:31:32

+0

@VAAA:好的,我們沒有任何關於你從哪裏調用的內容......我們甚至不知道這是什麼類型的應用程序...所以我不能真正幫助你的代碼沒有顯示。 – 2013-02-27 16:46:40

+0

它是一個桌面應用程序,並通過點擊一個按鈕調用UploadAllDocuments()。 – VAAA 2013-02-27 16:48:06