0

可能重复:
在 UI 线程被阻塞时在后台线程中执行 WebRequest

看看这段代码:

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.加入(10000);
  3. var client = new WebClient();
  4. client.DownloadStringAsync(new Uri(" http://www.google.com "));
  5. (... Join() 超时)
  6. 布尔点 B = 真;
4

1 回答 1

1

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

好消息是微软似乎修复了这个“错误”,正如你在 Silverlight 5 中调用它的理由:http: //msdn.microsoft.com/en-us/library/gg986857 (VS.95).aspx

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

一旦我在 Silverlight 5 上测试我的代码以查看它是否确实解决了问题,我将编辑此答案。

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

于 2012-09-06T15:22:25.940 回答