【问题标题】:Can't use current application during using WebClient使用 WebClient 期间无法使用当前应用程序
【发布时间】:2017-08-04 22:09:41
【问题描述】:

我试图更新一些数据而不询问 Windows 应用程序上的用户,但是当我尝试下载时,应用程序不可用并且控件不可触摸。

代码:

using (WebClient client = new WebClient {Encoding = System.Text.Encoding.UTF8})
{
string url = "http://domain_name.com/api/getSomeData";

res = client.DownloadString(url);
}

【问题讨论】:

  • 您需要调查 awaitasync 的 C#。
  • 您正在 UI 线程上运行下载,因此在下载过程中它无法响应。您需要了解线程。
  • 第一个答案给你一个线索(2.)。但是,当您开始将async 方法添加到您的应用程序时,您会发现设计将开始发生变化(如果您做得正确的话)。祝你好运。
  • 这绝对有可能,但您需要先了解为什么这不起作用,而且它不起作用是因为您正在使用 UI 线程。当您了解线程时,您将知道答案,并且下次可以正确执行。盲目地复制和粘贴别人的代码来解决问题并不能使你成为一名优秀的开发人员......
  • 优秀的建议 garfbradaz。学习异步应该彻底颠覆你的整个编程范式:)

标签: c# webclient downloadstring


【解决方案1】:

这很可能是因为您在 UI 线程上执行代码。当您的 UI 线程很忙时,它无法从鼠标或键盘泵送窗口消息,例如输入事件。您的选择是:

  1. 在单独的线程上运行此代码。

  2. 使用异步技术,例如 WebClient.DownloadStringAsync 或 DownloadStringTaskAsync。

其中,选项 #2 是更好的做法。

有关正确使用这两个选项的示例,请参阅这个已关闭的“离题”问题的已接受答案(尽管数字已从我的列表中交换)how to use async and await on a method that is time comsuming

【讨论】:

  • @AliMajidiFard9 当你得到它时,它应该会让你大吃一惊:)
  • @hoodaticus 谢谢你,你的链接解决了我的问题,也很漂亮和简单,谢谢:)
  • @AliMajidiFard9 - 好!尝试让所有 I/O 都使用类似的异步技术,这样你就会在这方面处于领先地位。
猜你喜欢
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多