2017-05-04 5 views
0

大きなファイル(約1GB)をダウンロードしようとしています。私がダウンロードを開始したら、ダウンロードが完了するまでアプリを使用できません。それはUIをブロックし、応答しなくなります。DownloadFileAsyncが私のアプリケーションをブロックしています

以下のコードでは、ユーザがUIのボタンをダウンロードすると、DownloadFileメソッドが呼び出されます。ダウンロードが開始されますが、UIはフリーズされます。

私はDownloadFileAsyncがUIをブロックしないと読んでいます。しかし、ここでそのブロック。それを正しい方法で使用する方法。いくつかの答えがありますが、私がテストしているときには何も働いていません。

コード:

ボタンコール:

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
     Debug.WriteLine("1");   
     DownloadGamefile DGF = new DownloadGamefile(); 
     Debug.WriteLine("2" + Environment.CurrentDirectory); 
     DGF.DownloadFile("URL(https link to zip file)", Environment.CurrentDirectory + @"\ABC.zip"); 
     Debug.WriteLine("3"); 
} 

ダウンロードコード:

class DownloadGamefile 
{ 
    private volatile bool _completed; 

    public void DownloadFile(string address, string location) 
    { 
     WebClient client = new WebClient(); 
     Uri Uri = new Uri(address); 
     _completed = false; 

     client.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed); 

     client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgress); 
     client.DownloadFileAsync(Uri, location); 

    } 

    private void DownloadProgress(object sender, DownloadProgressChangedEventArgs e) 
    { 
     // Displays the operation identifier, and the transfer progress. 
     Console.WriteLine("{0} downloaded {1} of {2} bytes. {3} % complete...", 
      (string)e.UserState, 
      e.BytesReceived, 
      e.TotalBytesToReceive, 
      e.ProgressPercentage); 
    } 

    private void Completed(object sender, AsyncCompletedEventArgs e) 
    { 
     if (e.Cancelled == true) 
     { 
      Console.WriteLine("Download has been canceled."); 
     } 
     else 
     { 
      Console.WriteLine("Download completed!"); 
     } 

     _completed = true; 
    } 
} 
+0

'DownloadFileAsync'がUIのフリーズを引き起こしていることをどのように知っていますか?何のために 'DownloadCompleted'を使っていますか?私はそれがそれと関係があると思う。 –

+0

今のところ、私はそれを書いただけですが、どこでも使用していません。編集したコード。 – djkp

+0

'DownloadFileAsync'がUIスレッドをブロックする唯一の方法は、ファイルのダウンロードが完了するまで返されない場合です。それは何が起こっているのですか?その呼び出しにブレークポイントを設定してからステップを実行すると、デバッガはすぐに次の行にステップしますか、またはファイルがダウンロードされるまでメソッド呼び出しに配置されますか? – jmcilhinney

答えて

0

このlinkを参照してください。実際の問題は、ダウンロードされたバイト数(ダウンロードプロセスの進捗状況)に関する多くのフィードバックを得ています。タイマーで2秒ごとに進捗状況を確認してください。これで問題は解決しました。

関連する問題