2011-01-11 5 views
2

最近、バグのような気がします。 = Pシンプルなrxコードは、ビジュアルスタジオ2010のデバッグ中にのみ、Windowsフォームでサイレントに失敗します。

私はついに今日少し時間をかけて、少しRxを探索しました。

相続人は私がやったこと:

alt text

ここでコードを実行している唯一の作品です。今

private void button1_Click(object sender, EventArgs e) 
{ 
     var txtc = Observable.FromEvent<EventArgs>(textBox1, "TextChanged") 
       .Throttle(TimeSpan.FromSeconds(0.5)) 
       .SubscribeOnDispatcher();//**also tried .SubscribeOn(this) 
     var t = from x in txtc select textBox1.Text; 
     t.Subscribe(x => listBox1.Items.Add(x)); 
} 

、デバッグ(F5)を実行したときに、私はすべての良い、ボタンをクリックして、私は何か入力してください。フォームはただ静かに死ぬ!

デバッグなしで実行すると、アプリケーションは完璧に実行されます。

注:私はWin7x64にそのイベントに例外に壊していないVSであるため、既知のバグのForm.Loadイベントからコードを削除(とはい私のマシンのthats)

これは何ですか

'vshost.NotifyLoad'(0x1438)はコード0(0x0の)で終了したスレッド:デバッグ出力は次のようになります。

スレッド 'vshost.LoadReference'(0x155c)がコード0(0x0)で終了しました。

'RxWinForms.vshost.exe'(Managed(v4.0.30319)):ロードされた '\ RxWinForms \ bin \ Debug \ RxWinForms.exe'、シンボルがロードされました。

'System.InvalidOperationException' 種類の最初のチャンス例外のSystem.Windows.Forms.dll

で発生したプログラム '[5228] RxWinForms.vshost.exe:管理(v4.0.30319)は' で終了しましたコード0(0x0)。

プログラム '[5228] RxWinForms.vshost.exe:プログラムトレース'がコード0(0x0)で終了しました。あなたはUIを試してみて、変更前の

答えて

3

あなたはどちらかのスロットリングは、現在のディスパッチャ上で起きていることや、あなたがObserveOn(ないSubscribeOn)を流れる電流ディスパッチャへ切り替えることを確認する必要があります(私がいることを信じています既定では、ThrottleはTaskPoolで行われます)。

だから、仕事下記のソリューションの両方:

private void button1_Click(object sender, EventArgs e) 
{ 
    txtc = Observable.FromEvent<EventArgs>(textBox1, "TextChanged") 
     .Throttle(TimeSpan.FromSeconds(0.5)) 
     .ObserveOn(Scheduler.Dispatcher); 

    var t = from x in txtc 
      select textBox1.Text; 

    t.Subscribe(x => listBox1.Items.Add(x)); 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    txtc = Observable.FromEvent<EventArgs>(textBox1, "TextChanged") 
     .Throttle(TimeSpan.FromSeconds(0.5), Scheduler.Dispatcher) 

    var t = from x in txtc 
      select textBox1.Text; 

    t.Subscribe(x => listBox1.Items.Add(x)); 
} 
+0

+ 1優れている、私は問題を打つと思った!私に言う、 'SubscribeOnDispatcher()'は何ですか?多くの例が 'SubscribeOnDispatcher()'を使用しているので、ちょっと迷惑なようです。 – gideon

+0

@giddyおそらく、観察可能なソース(IObservableを実装しているもの)がSubscribe()呼び出し中にブロックする場合は、SubscribeOnを使用して、そうでないことを確認できます。 –

+0

ありがとう=)私は... SubscribeOnDispatcher()は本当に何をしていますか?私は 'SubscribeOnDispatcher()'と 'SubscribeOn'の両方を呼び出しますか、部分的に間違ったオリジナルのコードですか? – gideon

2

ジェームズは正しいです。ただし、ISchedulerメソッドのオーバーロード(Throttleなど)を使用することをお勧めします。デフォルトのオーバーロードを使用してからObserveOn(タスクプールにジャンプしてからディスパッチャに戻す)を使用することをお勧めします。

関連する問題