看看这段代码:
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()
编辑:为了让事情一目了然,我在逐步执行此代码时看到的操作顺序是
- t.Start()
- t.加入(10000);
- var client = new WebClient();
- client.DownloadStringAsync(new Uri(" http://www.google.com "));
- (... Join() 超时)
- 布尔点 B = 真;