0

私はSilverlight4と新しい非同期CTPを使用しています。

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            WebClient wb = new WebClient();
            var t = wb.DownloadStringTaskAsync("http://www.google.com");
            t.Wait();            
        }

このコードにより、UIがフリーズします。
一方、このコードは正常に機能します:

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            WebClient wb = new WebClient();
            var t = Task.Factory.StartNew(() => Debug.WriteLine("Doing something"));
            t.Wait();            
        }

2つの違いは何ですか?最初の1つがフリーズする原因は何ですか?

4

1 に答える 1

0

.Wait()完了するまでタスクをブロックします。

最初の例は実際の作業を行います。つまり、www.google.comをフェッチし、with.Wait()は、そのページがダウンロードされるまでイベントハンドラーが戻ることを許可しません。

2番目の例は、単に呼び出すだけDebug.WriteLineです。つまり、すぐに戻る呼び出しで、タスクをすぐに完了できるため.Wait()、イベントハンドラーがブロックされていることに気付くことはありません。

ほとんどの場合、非同期ダウンロードの結果にアクセスする.ContinueWith()代わりに使用することをお勧めします。.Wait()そうすれば、イベントハンドラーがすぐに戻り、.ContinueWith()ダウンロードしたデータを処理するためのコードをブロックに入れることができます。

于 2011-08-04T18:32:47.247 に答える