このコードをチェックしてください:
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 スレッドで発生することはわかっています (こちらを参照してください: WebClient を使用した Silverlight バックグラウンド スレッド)。
私のコードの動作は、非同期呼び出しメソッド自体 (DownloadStringAsync()) にも UI スレッドが必要であることを示しているようです。そうですか?もしそうなら、なぜですか?また、使用時にこれと同じ動作が見られることに注意したいHttpWebRequest.BeginGetResponse()
編集:物事を明確にするために、このコードをステップ実行するときに表示される操作の順序は次のとおりです
- t.Start()
- t.Join(10000);
- var クライアント = 新しい WebClient();
- client.DownloadStringAsync(new Uri(" http://www.google.com "));
- (... Join() タイムアウト)
- bool pointB = true;