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 スレッドで発生することはわかっています (こちらを参照してください: WebClient を使用した Silverlight バックグラウンド スレッド)。

私のコードの動作は、非同期呼び出しメソッド自体 (DownloadStringAsync()) にも UI スレッドが必要であることを示しているようです。そうですか?もしそうなら、なぜですか?また、使用時にこれと同じ動作が見られることに注意したいHttpWebRequest.BeginGetResponse()

編集:物事を明確にするために、このコードをステップ実行するときに表示される操作の順序は次のとおりです

  1. t.Start()
  2. t.Join(10000);
  3. var クライアント = 新しい WebClient();
  4. client.DownloadStringAsync(new Uri(" http://www.google.com "));
  5. (... Join() タイムアウト)
  6. bool pointB = true;
4

1 に答える 1

1

わかりました、もう少し掘り下げて答えを見つけたと思います。確かに、すべてのネットワーク コードは最終的に UI スレッドで実行されるようです: http://nondestructiveme.com/2010/11/23/silverlight-and-networking-the-ui-thread/

良いニュースは、Microsoft が Silverlight 5 でこの「バグ」を修正したようです

(パフォーマンスの向上の下のページの下部: 「ネットワークのバックグラウンド スレッドを使用することで、ネットワークの待機時間を短縮しました。これは、クライアントの HTTP Web 要求を使用するシナリオに役立ちます。」)

Silverlight 5 でコードをテストして、実際に問題が解決したかどうかを確認したら、この回答を編集します。

編集:Silverlight 5 に対してビルドされていますが、まだ同じ問題が発生しています。UIスレッドをまったくブロックしようとするのをあきらめる時が来たと思います...

于 2012-09-06T15:22:25.940 に答える