Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WebClient.DownloadProgressChanged:Console.WriteLine()正在阻止UI线程_C#_Webclient_Downloadfileasync - Fatal编程技术网

C# WebClient.DownloadProgressChanged:Console.WriteLine()正在阻止UI线程

C# WebClient.DownloadProgressChanged:Console.WriteLine()正在阻止UI线程,c#,webclient,downloadfileasync,C#,Webclient,Downloadfileasync,我有以下简单的代码: private void btn_download_Click(object sender, EventArgs e){ WebClient client = new WebClient(); client.DownloadProgressChanged += client_DownloadProgressChanged; client.DownloadFileAsync(new Uri("http://.../file.zip"), "file.

我有以下简单的代码:

private void btn_download_Click(object sender, EventArgs e){

    WebClient client = new WebClient();
    client.DownloadProgressChanged += client_DownloadProgressChanged;
    client.DownloadFileAsync(new Uri("http://.../file.zip"), "file.zip");

}

void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e){
    //Prints: "Downloaded 3mb of 61.46mb  (4%)"

    Console.WriteLine("Downloaded "
        + ((e.BytesReceived / 1024f) / 1024f).ToString("#0.##") + "mb"
        + " of "
        + ((e.TotalBytesToReceive / 1024f) / 1024f).ToString("#0.##") + "mb"
        + "  (" + e.ProgressPercentage + "%)"
    );
}

为什么会阻塞UI线程?当我用代码替换控制台.WriteLine()以更新我的进度条(不显示在代码中)时,它可以工作。用户界面响应迅速。

您的操作方式似乎就是如何操作。我也试过了,得到了同样的结果。当在一个单独的线程中运行某个东西时,您会看到类似的行为,该线程会过快地调用主UI线程,并使用更新对其进行重击。UI线程得到备份并有效冻结

下载进度更改
事件很快触发。。。似乎是每秒数百次,这意味着它试图以如此快的速度写入控制台

您可以限制写入控制台的频率,这将解决问题(我通过尝试下载4GB ISO对其进行了测试,它在保持UI响应的同时写入控制台):


你做这件事的方式似乎就是如何做。我也试过了,得到了同样的结果。当在一个单独的线程中运行某个东西时,您会看到类似的行为,该线程会过快地调用主UI线程,并使用更新对其进行重击。UI线程得到备份并有效冻结

下载进度更改
事件很快触发。。。似乎是每秒数百次,这意味着它试图以如此快的速度写入控制台

您可以限制写入控制台的频率,这将解决问题(我通过尝试下载4GB ISO对其进行了测试,它在保持UI响应的同时写入控制台):


是否有要写入的控制台?为什么要从GUI程序写入控制台?在这里使用
Debug
类或者
TraceListener
更有意义吗?@PeterDuniho编写控制台基本上是输出到“标准输出”,这可以在“输出:Visual Studio中的窗口。加上“是”,这会更有意义,但我的问题不是要求其他选择。我想知道这背后的原因behaviour@GrantWinney控制台更新,即我可以看到控制台.WriteLine()的输出,但是GUI被卡住了。下载完成后,GUI将再次响应。是否有可写入的控制台?为什么要从GUI程序写入控制台?在这里使用
Debug
类或者
TraceListener
更有意义吗?@PeterDuniho编写控制台基本上是输出到“标准输出”,这可以在“输出:Visual Studio中的窗口。加上“是”,这会更有意义,但我的问题不是要求其他选择。我想知道这背后的原因behaviour@GrantWinney控制台更新,即我可以看到控制台.WriteLine()的输出,但是GUI被卡住了。下载完成后,GUI将再次响应完美的dude!这真让我困惑,完美的哥们!这真让我困惑。
// define a class-level field variable
private int counter;

private void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
    counter++;

    // Only print to the console once every 500 times the event fires,
    //  which was about once per second when I tested it
    if (counter % 500 == 0)
    {
        //Prints: "Downloaded 3mb of 61.46mb  (4%)"
        Console.WriteLine("Downloaded "
                          + ((e.BytesReceived / 1024f) / 1024f).ToString("#0.##") + "mb"
                          + " of "
                          + ((e.TotalBytesToReceive / 1024f) / 1024f).ToString("#0.##") + "mb"
                          + "  (" + e.ProgressPercentage + "%)"
            );
    }
}