DownloadStringAsync需要UI线程吗?

时间:2012-09-05 20:35:41

标签: silverlight asynchronous

  

可能重复:
  Execute a WebRequest in a Background thread while UI Thread is blocked

查看此代码:

Thread t = new Thread((a) =>
    {
        var client = new WebClient();

        client.DownloadStringAsync(new Uri("http://www.google.com"));

        bool pointB = true;
    });

t.Start();
t.Join(10000);

当在Silverlight中的UI线程上运行此操作时,即使快速调用DownloadStringAsync(),也不会在Join()超时之后到达pointB。这意味着DownloadStringAsync()必须以某种方式要求UI线程完成其工作。 注意:这与回调与DownloadString 无关。我知道WebClient的回调发生在UI线程上(参见这里:Silverlight Background Thread using WebClient)。

我的代码的行为似乎表明异步调用方法本身(DownloadStringAsync())也需要UI线程。是对的吗?如果是这样,为什么?我还想指出使用HttpWebRequest.BeginGetResponse()

时会出现同样的行为

编辑:为了使事情变得清晰,我在单步执行此代码时看到的操作顺序是

  1. t.Start()
  2. t.Join(10000);
  3. var client = new WebClient();
  4. client.DownloadStringAsync(new Uri(“http://www.google.com”));
  5. (...加入()超时)
  6. bool pointB = true;

1 个答案:

答案 0 :(得分:1)

好吧,我想在经过多挖掘之后我找到了答案。确实所有网络代码最终都在UI线程上运行: http://nondestructiveme.com/2010/11/23/silverlight-and-networking-the-ui-thread/

好消息是,似乎微软修复了这个“bug”,因为在Silverlight 5中你可能有理由对它进行调用: http://msdn.microsoft.com/en-us/library/gg986857(VS.95).aspx

(在性能改进下的页面底部: “通过使用后台线程进行联网来减少网络延迟。这对使用客户端HTTP Web请求的场景很有帮助。”)

一旦我在Silverlight 5上测试代码,我就会编辑这个答案,看看它是否确实解决了这个问题。

编辑:针对Silverlight 5构建,我仍然遇到同样的问题。我认为现在是时候放弃尝试阻止UI线程......