如何停止C#应用程序';防止用户界面在从internet下载大文件时变得无响应

如何停止C#应用程序';防止用户界面在从internet下载大文件时变得无响应,c#,wpf,C#,Wpf,我已经创建了一个C#WPF应用程序。在我的代码中,我使用WebClient.DownloadFile()从internet下载了一个大文件 当我这样做时,应用程序的UI会变得无响应(应用程序不会冻结,如果我将其保留足够长的时间,它会下载并恢复正常) 代码本身位于从UI线程调用的另一个脚本中。阻止UI失去响应的最佳方法是什么?使用此方法在工作线程中下载文件。在此过程中,UI线程将保持响应 方法文档很好地解释了这一点: 此方法在中指定的URI处下载资源 地址参数。当下载成功完成时 下载的文件在本地计

我已经创建了一个C#WPF应用程序。在我的代码中,我使用WebClient.DownloadFile()从internet下载了一个大文件

当我这样做时,应用程序的UI会变得无响应(应用程序不会冻结,如果我将其保留足够长的时间,它会下载并恢复正常)

代码本身位于从UI线程调用的另一个脚本中。阻止UI失去响应的最佳方法是什么?

使用此方法在工作线程中下载文件。在此过程中,UI线程将保持响应

方法文档很好地解释了这一点:

此方法在中指定的URI处下载资源 地址参数。当下载成功完成时 下载的文件在本地计算机上命名为fileName。文件是 使用以下线程资源异步下载 从线程池自动分配。收到通知 当文件可用时,将事件处理程序添加到 DownloadFileCompleted事件

在调用资源时,此方法不会阻止调用线程 正在下载。要在等待下载完成时阻止, 使用下载文件方法之一

可以使用CancelAsync方法取消异步操作 还没有完成的

使用该方法在工作线程中下载文件。在此过程中,UI线程将保持响应

方法文档很好地解释了这一点:

此方法在中指定的URI处下载资源 地址参数。当下载成功完成时 下载的文件在本地计算机上命名为fileName。文件是 使用以下线程资源异步下载 从线程池自动分配。收到通知 当文件可用时,将事件处理程序添加到 DownloadFileCompleted事件

在调用资源时,此方法不会阻止调用线程 正在下载。要在等待下载完成时阻止, 使用下载文件方法之一

可以使用CancelAsync方法取消异步操作 还没有完成的


使用类似以下内容:

... //You earlier code
await Task.Run(() => /*your large file downloading code */);
...//Your later code

使用类似以下内容:

... //You earlier code
await Task.Run(() => /*your large file downloading code */);
...//Your later code

答案很明显,不是吗?通过使用多线程,在不同的线程中下载文件。答案的可能重复是显而易见的,不是吗?通过使用多线程,在不同的线程中下载文件。Task.Run的可能副本应保留给CPU绑定的工作,而不是IO绑定的工作。您需要的是Just async/await。@Crowcoder这是将同步代码包装为async的最佳实践方式,伙计。阅读更多关于async/await实现的信息,您将看到在.NET异步方法中使用了相同的机制。这就是为什么我知道在Task.run中运行IO绑定代码是浪费的原因。没有迹象表明OP仅限于同步代码。@Crowcoder是的,我知道本文中的大多数示例,以及用异步包装同步代码的“更好”方法。我的建议如本文所述:“结论:不要在方法的实现中使用Task.Run;相反,使用Task.Run调用方法。”@dmitry CPU绑定异步函数和IO绑定异步函数不使用相同的机制。第一种方法是使用线程(至少Task.Run需要),而后者不需要线程。Task.Run应该保留用于CPU绑定的工作,而不是IO绑定的工作。您需要的是Just async/await。@Crowcoder这是将同步代码包装为async的最佳实践方式,伙计。阅读更多关于async/await实现的信息,您将看到在.NET异步方法中使用了相同的机制。这就是为什么我知道在Task.run中运行IO绑定代码是浪费的原因。没有迹象表明OP仅限于同步代码。@Crowcoder是的,我知道本文中的大多数示例,以及用异步包装同步代码的“更好”方法。我的建议如本文所述:“结论:不要在方法的实现中使用Task.Run;相反,使用Task.Run调用方法。”@dmitry CPU绑定异步函数和IO绑定异步函数不使用相同的机制。第一种是使用线程(至少Task.Run是这样),而后者不需要线程。