2012-03-01 8 views
0

私は自分自身で進捗バーが知っているが、すでに死に頼まれてきたが、私は1つに問題を抱えています。私はFTP経由でファイルをダウンロードする必要があり、私はWebクライアントを使用しています、ダウンロードしたデータは、バイト配列に保存する必要があるが、WebClient.DownloadDataAsyncは直接それを返すことができないので、私は、データをアクセスもするDownloadDataCompletedメソッドを使用する必要があります。ときにバイト配列が存在しないため、アプリケーションがクラッシュし、そこOKですが、問題は、私は全体のスレッドをブロックせずのIEnumeratorブロックを「一時停止」することはできません、と私はそれを一時停止していない場合ということであるまで、すべてアップそれにアクセスしようとします。ダウンロードするファイルがhttpであったとき、私はWWWを使いましたが問題はありませんでしたが、FTPに移動しなければなりませんでした。 WebClient.DownloadDataを使用すると動作しますが、プログレスバーを含めるように求められました。とにかく、here'sコード:イテレータブロック内にダウンロードプログレスバーを作成できますか?

IEnumerator DownloadGame(Dictionary<string, string> settingsDict) 
    { 
     statusText = "Starting download..."; 
     WebClient request = new WebClient(); 
     request.Credentials = new NetworkCredential("user", "password"); 
     request.DownloadDataCompleted += DownloadDataCompleted; 

     //byte[] fileData = request.DownloadData(settingsDict["downloadlink"]); This works, but is no good since it blocks the thread 
    request.DownloadDataAsync(new Uri(settingsDict["downloadlink"]),"somefilepath"); 


    //do{}while(!downloadFinished); This also works but blocks the thread anyway 


    //Process the update 
    string tmpRoot = TMPFolder(); 
    string tmpFolder = tmpRoot + Application.platform + settingsDict["latestVersion"] + "/"; 
    if (!UnzipUpdate(fileData, tmpFolder))//fail here, in this case fileData is global 
    { 
     DeleteDirectory(tmpRoot); 
     yield break; 
    } 
    if (!ProcessUpdateData(tmpFolder)) 
    { 
     DeleteDirectory(tmpRoot); 
     yield break; 
    } 
    DeleteDirectory(tmpRoot); 

    settingsDict["thisVersion"] = GetNextVersion(); 
} 

void DownloadDataCompleted(object sender, DownloadDataCompletedEventArgs e){ 

    fileData = e.Result; 
    downloadFinished = true; 
} 

答えて

0

以前Stakoverflowポストに基づいて、このようなものを使用することができます。..

は、最も簡単にはBackgroundWorkerを使用してDoWorkイベントハンドラにコードを置くことです。 BackgroundWorker.ReportProgressで進行状況を報告します。

基本的な考え方:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    var ftpWebRequest = (FtpWebRequest)WebRequest.Create("ftp://xxx.com"); 
    ftpWebRequest.Method = WebRequestMethods.Ftp.UploadFile; //or DownLoad 
    using (var inputStream = File.OpenRead(fileName)) 
    using (var outputStream = ftpWebRequest.GetRequestStream()) 
    { 
     var buffer = new byte[1024 * 1024]; 
     int totalReadBytesCount = 0; 
     int readBytesCount; 
     while ((readBytesCount = inputStream.Read(buffer, 0, buffer.Length)) > 0) 
     { 
      outputStream.Write(buffer, 0, readBytesCount); 
      totalReadBytesCount += readBytesCount; 
      var progress = totalReadBytesCount * 100.0/inputStream.Length; 
      backgroundWorker1.ReportProgress((int)progress); 
     } 
    } 
} 

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) 
{ 
    progressBar.Value = e.ProgressPercentage; 
} 

WorkerReportsProgressていることを確認してくださいあなたも簡単にアップロード取り消しを実装することができBackgroundWorker

backgroundWorker2.WorkerReportsProgress = true; 

が有効になっています。

+0

スレッディングは、おかげで助けをしました。 – Samssonart

+0

よろしくお願いします..ハッピーコーディングマルコ – MethodMan

関連する問題