2013-04-04 10 views
0

我:UploadFileAsync用foreach

foreach (FileInfo fileinfo in Arquivos) 
       { 
        float zz = (float)fileinfo.Length; 
        zz = (zz/1024f)/1024f; 
        label8.Text = "sending: " + fileinfo.Name + "("+zz.ToString("0.0")+"MB)..."; 
        label8.Update(); 
        WebClient client = new System.Net.WebClient(); 
        client.Credentials = new System.Net.NetworkCredential(usuario, senha); 
        client.UploadProgressChanged += new UploadProgressChangedEventHandler(UploadProgressCallback); 
        client.UploadFile(new Uri("ftp://" + ftp + "/" + caminho + "//" + fileinfo.Name), "STOR", pasta + mes + fileinfo.Name); 
        bar++; 

        backgroundWorker1.ReportProgress(bar); 
       } 

我需要創建一個UploadProgressChanged,所以我有:

client.UploadProgressChanged += new UploadProgressChangedEventHandler(UploadProgressCallback); 

而且

private void UploadProgressCallback(object sender, UploadProgressChangedEventArgs e) 
     { 
      progressBar2.Value = e.ProgressPercentage; 
      progressBar2.Update(); 
     } 

UploadProgressChanged不UploadFile工作,只是UploadfileAsync ,但我需要每次發送1個文件。如何將UploadFile更改爲UploadFileAsync並每次發送文件?

回答

1

如果您一次只能發送一個文件,那麼您爲什麼要關注使用異步?您似乎也在使用後臺工作人員來完成所有工作。

對於每個要上傳的文件,您可能不會更好地爲每個文件啓動一個「任務」,並使用一個只允許同時執行一項任務的調度程序將它踢出去嗎?

看到:http://msdn.microsoft.com/en-us/library/ee789351.aspx

這樣,你可以利用一些新的任務和異步方法可用,同時簡化您的任務。


基礎上,進一步分析,如果你想異步運行它們,但只能做一次一個:

private AutoResetEvent _fileUploadedEvent = new AutoResetEvent(false); 
    private void DoUploadBackgroundWorker() 
    { 
     foreach (var file in files) 
     { 
      client.WhenUploaded += (s, e) => 
       { 
        // This signals the AutoResetEvent that it can continue 
        _fileUploadedEvent.Set(); 
       }; 
      client.UploadAsync(); 
      // This will keep ticking over every 15 milliseconds to check if the 
      // AutoResetEvent has been triggered 
      while (_fileUploadedEvent.WaitOne(15)) { } 
      // We get here when it's been triggered (which means the file was uploaded) 
      // So we can update the progressbar here and then move onto the next file. 
     } 
    } 

它需要擴大和類不正確的,因爲我已經好得不得了這一起,但它應該提供足夠的材料,以開始你的方向。

+0

嗯,我是C#新手,是的,我在背景技術中運行foreach。我需要的是爲每個上傳的文件創建一個進度條,因爲它是大文件。 – 2013-04-04 17:40:51