2017-01-21 7 views
0

私は基本的なforループを持っています。これは基本的にダウンロードファイルです。ラベルが進行している限り、ラベルを更新するはずです。Xamarin UILabelが更新されない

ここでStack Overflowを検索すると、SetNeedsDisplay()を使用する方向が見つかりました。しかし、それはまだ更新を拒否しています。何か案が ?

for (int i = 0; i < files.Length; i++) 
    { 
        status.Text = "Downloading file " + (i + 1) + " of " + files.Length + "..."; 
        status.SetNeedsDisplay(); 
        string remoteFile = assetServer + files[i]; 
        var webClient2 = new WebClient(); 
        string localFile = files[i]; 
        string localPath3 = Path.Combine(documentsPath, localFile); 
        webClient2.DownloadFile(remoteFile, localPath3); 
    } 
+0

これはバックグラウンドスレッドで実行していますか? – BytesGuy

+0

Nope.Nope.Nope。 –

+0

UIスレッドをブロックしたり、バックグラウンドスレッドでダウンロードしたり、 'await Task.Run(...)'と同じように簡単にダウンロードしたり、UIスレッドでUILabelを更新したりしないでください。 – SushiHangover

答えて

1

これまでに説明したように、重いトランザクションを実行するときにUIをブロックしないようにしてください。 WebClientには、既に使用できる非同期メソッドがあります。

webClient2.DownloadFileasync(new System.Uri(remoteFile), localPath3); 

とUI要素にアクセスするときInvokeOnMainThread組み込みメソッドを使用し、別のスレッドからUIにアクセスすることを防ぐために。

InvokeOnMainThread (() => { 
    status.Text = "Downloading file " + (i + 1) + " of " + files.Length + "..."; 
    status.SetNeedsDisplay(); 
}); 

、最終的にリソースの処分であなたを助けるためにステートメントを使用してを使用しています。

using (var webClient2 = new WebClient()) 
{ 
    webClient2.DownloadFileAsync (new System.Uri (remoteFile), localPath3); 
} 

また、usingステートメントの内側にあなたが代わりにあなたがあなたのfilesアレイ内で使用可能なすべてのファイルをダウンロードするには、同じオブジェクトを使用する各ファイルに対してWebクライアントオブジェクトを作成する必要はありません。この方法を反復を持つことができます。

関連する問題