2012-02-14 8 views
1

私は他のポストで書いた非同期の例をテストしていましたが、テキストボックスに情報を表示するように修正しました。次に起こったことは私が期待していなかった。別のスレッドからコントロールを変更するときに例外がスローされない理由はわかりません。私は盲目ですか、なぜ私はそれを見ませんか?こここの非同期の例は、DispatcherもControl.BeginInvokeも使用しないとなぜ機能するのですか?

は一例であり、それはSilverlightとWinFormsのために同じことを動作します:

int rand=0; 
    public MainPage() 
    { 
     InitializeComponent(); 
    } 

    public Func<Action<int, int>, Action<int>> DownloadDataInBackground = (callback) => 
    { 
     return (c) => 
     { 
      WebClient client = new WebClient(); 
      Uri uri = new Uri(string.Format("https://www.google.com/search?q={0}", c)); 
      client.DownloadStringCompleted += (s, e2) => 
      { 
       callback(c, e2.Result.Length); 
      }; 
      client.DownloadStringAsync(uri); 
     }; 
    }; 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     int callid = rand++; 
     Debug.WriteLine("Executing CallID #{0}", callid); 
     DownloadDataInBackground((c3, r3) =>this.textBox1.Text+=string.Format("The result for the callid {0} is {1} \n", c3, r3))(callid); 
    } 

は、それが失敗文句を言わない、非常に高速のボタンをタップします。

ご協力いただきますようお願い申し上げます。

編集:ウィンドウのフォームが常にメインスレッドからコントロールの変更を実行することを示す画像が追加されましたが、なぜ別のものになっているのでしょうか? winfors mainthread

+0

十分に実行した場合、問題が発生します。それは "ランダム"と思われる。 –

+0

はい、私はテストし、150回以上をクリックし、それが失敗すると、今質問は、なぜ失敗するには時間がかかりますか? – montelof

+0

あなたが実際にやっていることは、実際には問題が発生する可能性が少しあります。なぜなら、更新が入ったときにUIがそれほど多くなくなっているからです。 150の1は非常に高い失敗率です。 –

答えて

1

あなたのコードが期待通りに失敗しない理由の実際の答えは、WebClientがUIスレッドでイベントを呼び出すことです。したがって、あなたは、あなたが想像しているように、別のスレッドでコントロールを変更していません。

+0

はい、すべてを説明しています... – montelof

+0

私は、BackgroundWorkerとWebClientであるメインスレッド上でイベントを実行するのは2つのクローンだけであることを読んでいます。ありがとう。私はスレッドがメインスレッドのコントロールを変更できる別の次元に入っていたと思っていました。 – montelof

関連する問題