C# DownloadFileAsync正在阻止我的应用程序

C# DownloadFileAsync正在阻止我的应用程序,c#,.net,wpf,downloadfileasync,C#,.net,Wpf,Downloadfileasync,我正在尝试从我的服务器下载一个大文件(大约1GB)。当我开始下载时,在下载完成之前,我无法使用该应用程序。它正在阻塞用户界面并使其变得无响应 在下面的代码中,当用户在UI上单击“下载”按钮时,我正在调用DownloadFile方法。然后开始下载,但UI被冻结 我了解到DownloadFileAsync不会阻塞UI。但在这里它是阻塞的。如何正确使用它。有几个答案,但在我测试时没有一个是有效的 代码: 按钮调用: private void Button_Click(object sender, Ro

我正在尝试从我的服务器下载一个大文件(大约1GB)。当我开始下载时,在下载完成之前,我无法使用该应用程序。它正在阻塞用户界面并使其变得无响应

在下面的代码中,当用户在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;
    }
}

请参考这个。实际的问题是获得大量关于下载字节数的反馈(关于下载过程的进度)。每隔2秒或任何时间使用计时器获取进度,这就解决了问题。

您如何知道
DownloadFileAsync
导致UI冻结?您使用
DownloadCompleted
做什么?我打赌这与此有关。到目前为止,我只是编写了它,但没有在任何地方使用它。编辑的代码。DownloadFileAsync阻止UI线程的唯一方法是在文件下载完成后才返回。这就是发生的事吗?如果在该调用上放置一个断点,然后执行步骤,调试器是直接执行下一行,还是一直执行方法调用直到文件下载?我知道,因为我在单击下载btn后无法使用该应用程序,直到下载完成。该代码既不阻塞,也不使用WPF。请发一封信。