当前位置: 首页 > 编程语言 > C#

WebClient.DownloadProgressChanged-Console.WriteLine()blocksUIthreadshare

时间:2023-04-10 19:25:50 C#

WebClient.DownloadProgressChanged:Console.WriteLine()blocksUIthread我有以下简单代码:privatevoidbtn_download_Click(objectsender,EventArgse){WebClient客户端=newWebClient();client.DownloadProgressChanged+=client_DownloadProgressChanged;client.DownloadFileAsync(newUri("http://.../file.zip"),"file.zip");}voidclient_DownloadProgressChanged(objectsender,DownloadProgressChangedEventArgse){//打印:“已下载3mbof61.46mb(4%)”Console.WriteLine("Downloaded"+((e.BytesReceived/1024f)/1024f).ToString("#0.##")+"mb"+"of"+((e.TotalBytesToReceive/1024f)/1024f).ToString("#0.##")+"mb"+"("+e.ProgressPercentage+“%”);为什么这会阻塞UI线程?当我用代码替换Console.WriteLine()以更新我的进度条(未显示在代码中)时,它起作用了。用户界面是响应式的。你这样做的方式似乎是MSDN在他们的例子中展示的方式。我也试过了,得到了同样的结果。在单独的线程中运行某些东西时,您会看到类似的行为,然后过快地回调到主UI线程并将其与更新相关联。UI线程已备份并有效冻结。DownloadProgressChanged事件发生得非常快......似乎每秒数百次,这意味着它也在尝试快速写入控制台。您可以限制写入控制台的频率,这将解决问题(我通过尝试下载4GBISO并在保持UI响应的同时写入控制台进行了测试):以上是C#学习教程:WebClient.DownloadProgressChanged:安慰。WriteLine()阻止UI线程共享所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注——//定义一个类级别的字段变量privateintcounter;privatevoidclient_DownloadProgressChanged(objectsender,DownloadProgressChangedEventArgse){counter++;//每500次事件触发仅向控制台打印一次,//当我测试它时大约每秒一次if(counter%500==0){//打印:"Downloaded3mbof61.46mb(4%)"Console.WriteLine("下载"+((e.BytesReceived/1024f)/1024f).ToString("#0.##")+"mb"+"of"+((e.TotalBytesToReceive/1024f)/1024f).ToString("#0.##")+"mb"+"("+e.ProgressPercentage+"%)");}}本文采集自网络,不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: