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