可能重复:
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()
编辑:为了使事情变得清晰,我在单步执行此代码时看到的操作顺序是
答案 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线程......