простой код RX молча терпит неудачу в окнах форм только во время отладки в Visual Studio 2010 - PullRequest
2 голосов
/ 11 января 2011

Чувствуется, что в последнее время меня привлекают ошибки и проблемы!= P

Итак, сегодня я наконец-то взял отпуск, чтобы немного изучить 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));
 }

Теперь, когда запускается Debug (F5) Я нажимаю кнопку, все хорошо, я тогда что-то печатать, пуф!Форма просто тихо умирает !!

Если я запускаю без отладки, приложение работает без сбоев!

Примечание: я удалил код из события Form.Load из-заизвестная ошибка, при которой VS не работает при исключениях в этом событии на Win7x64 (и да, это моя машина)

Вот как выглядит отладочный вывод:

Поток vshost.NotifyLoad (0x1438) завершился с кодом 0 (0x0).

Поток vshost.LoadReference (0x155c) завершился с кодом 0 (0x0).

'RxWinForms.vshost.exe' (Управляемый (v4.0.30319)): загружен '\ RxWinForms \ bin \ Debug \ RxWinForms.exe', символы загружены.

Первое случайное исключение типа 'System.InvalidOperationException 'произошло в System.Windows.Forms.dll

Программа' [5228] RxWinForms.vshost.exe: Managed (v4.0.30319) 'завершила работу с кодом 0 (0x0).

Программа '[5228] RxWinForms.vshost.exe: трассировка программы' завершила работу с кодом 0 (0x0).

Ответы [ 2 ]

3 голосов
/ 11 января 2011

Необходимо убедиться, что на текущем диспетчере происходит либо регулирование, либо что вы снова переключаетесь на текущего диспетчера через ObserveOn (не SubscribeOn), прежде чем пытаться изменить пользовательский интерфейс (я считаю, что по умолчанию регулирование выполнено на 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));
}
2 голосов
/ 11 января 2011

Джеймс прав.Однако рекомендуется использовать перегрузку методов IScheduler (например, Throttle), а не перегрузку по умолчанию, а затем использовать ObserveOn (что заставит его перейти к пулу задач и затем вернуться к диспетчеру).

...