2013-08-07 32 views
0

我有从ftp服务器和两个进度条自动上传应用程序来更新整体和当前的下载状态。 第一个工作正常(更新%= currentFile为int/allFilesToDownload * 100%)。但我想上传当前文件下载。 我的代码:在同一时间更新两个进度条

Uri url = new Uri(sUrlToDnldFile); 

        int inde = files.ToList().IndexOf(file); 
        string subPath = ... 
        bool IsExists = System.IO.Directory.Exists(subPath); 
        if (!IsExists) 
         System.IO.Directory.CreateDirectory(subPath); 
        sFileSavePath = ... 
        System.Net.FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(new Uri(file)); 

        System.Net.FtpWebResponse response = (System.Net.FtpWebResponse)request.GetResponse(); 
        response.Close(); 
        long iSize = response.ContentLength; 
        long iRunningByteTotal = 0; 

        WebClient client = new WebClient(); 

        Stream strRemote = client.OpenRead(url); 

        FileStream strLocal = new FileStream(sFileSavePath, FileMode.Create, FileAccess.Write, FileShare.None); 

        int iByteSize = 0; 

        byte[] byteBuffer = new byte[1024]; 

        while ((iByteSize = strRemote.Read(byteBuffer, 0, byteBuffer.Length)) > 0) 
        { 
         strLocal.Write(byteBuffer, 0, iByteSize); 
         iRunningByteTotal += iByteSize; 
//THERE I'D LIKE TO UPLOAD CURRENT FILE DOWNLOAD STATUS 
         string a = iByteSize.ToString(); 
         double b = double.Parse(a.ToString())/100; 
         string[] c = b.ToString().Split(','); 
         int d = int.Parse(c[0].ToString()); 
         update(d); 
//update(int prog) { bgWorker2.ReportProgress(prog); } 


        } 

        double dIndex = (double)(iRunningByteTotal); 
        double dTotal = (double)iSize; 
// THIS CODE COUNTING OVERAL PROGRESS - WORKS FINE 
        double iProgressPercentage1 = double.Parse(ind.ToString())/double.Parse(files.Count().ToString()) * 100; 
        ind++; 
        string[] tab = iProgressPercentage1.ToString().Split(','); 

        int iProgressPercentage = int.Parse(tab[0]); 
        currentFile = file; 
        bgWorker1.ReportProgress(iProgressPercentage); 
        strRemote.Close(); 

不幸的是,我仍然得到错误,我不能更新progressBar2,becouse使用它另一个进程。 有没有办法做到这一点? 谢谢

+1

过程?你的意思是[线程](http://stackoverflow.com/questions/11923865/how-to-deal-with-cross-thread-access-exceptions),对吧? –

回答

1

通过dispatcher.BeginInvoke方法更新值。

Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(()=> 
{ 
    progressbar2.value = newvalue; 
})); 

This Dispatcher这会推动你工作到持有Progressbar2的主线程。