Silverlight DownloadStringAsync需要UI线程吗?
可能重复:Silverlight DownloadStringAsync需要UI线程吗?,silverlight,asynchronous,Silverlight,Asynchronous,可能重复: 查看此代码: 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线程上运行此命令
查看此代码:
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线程上(请参见此处:)
我的代码的行为似乎表明异步调用方法本身(DownloadStringAsync())也需要UI线程。是这样吗?如果是,为什么?我还想指出,在使用HttpWebRequest.BeginGetResponse()时,也会出现同样的行为
编辑:为了让事情变得非常清楚,当我逐步完成这段代码时,我看到的操作顺序是
t、 开始()
t、 加入(10000)李>
var client=new WebClient()李>
client.DownloadStringAsync(新Uri(“”)李>
(…Join()超时)
布尔点b=真李>
好吧,我想我在进一步挖掘后找到了答案。看起来所有网络代码最终都是在UI线程上运行的:
好消息是,微软似乎修复了Silverlight 5中的这个“bug”,您可以这样称呼它:
(在“性能改进”下的页面底部:
“通过使用用于联网的后台线程减少了网络延迟。这对于使用客户端HTTP web请求的场景很有帮助。”)
在Silverlight 5上测试代码后,我将编辑这个答案,看看它是否确实解决了这个问题
编辑:针对Silverlight 5构建,我仍然有同样的问题。我想是时候放弃阻止UI线程了……你是说Join超时了?Join()超时了,然后紧接着,点击了pointB。