我有一个基本的for循环,基本上是下载文件。只要它进展,它就应该更新标签。
通过在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 :(得分:1)
如前所述,尝试避免在重要事务中阻止UI。 WebClient已经有了一个可以使用的异步方法。
webClient2.DownloadFileasync(new System.Uri(remoteFile), localPath3);
并且为了防止您从其他线程访问UI,请在访问UI元素时使用内置方法 InvokeOnMainThread 。
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语句中进行迭代,这样您就不必为每个文件创建WebClient对象,而是使用相同的对象来下载files
数组中可用的所有文件