0

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

在下面的代码中,我DownloadFile在 UI 上的用户下载按钮时调用方法。然后下载开始,但 UI 被冻结。

我读到DownloadFileAsync不会阻止用户界面。但在这里它的阻塞。如何正确使用它。有几个答案,但在我测试时没有一个有效。

代码:

按钮调用:

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;
    }
}
4

1 回答 1

0

请参考此链接。实际的问题是得到很多关于下载字节数的反馈(关于下载过程的进度)。每隔 2 秒或任何时间设置一个计时器来获取进度,这解决了问题。

于 2017-05-04T05:56:09.907 回答