Реактивные расширения (Rx) пропускают событие

Почему rx, наблюдающий за событием, пропустил? Событие не обрабатывается в то время, когда оно происходит, поэтому внутреннее состояние объекта не обновляется и вызывает проблемы в следующих полученных событиях. Может ли это быть связано с ObserveOn NewThread?

private void UpdateList(Client client)
{
    var listUpdateReceive = Observable
        .FromEvent<ListEventArgs>(ev => client.ListUpdateReceive += ev, ev => client.ListUpdateReceive -= ev);

    listUpdateReceive.Take(1)
        .Subscribe(r =>
                       {
                           TraceInformation("List is updated.");

                           OnListUpdateReceived(r.Sender, r.EventArgs);
                       });
}

Я вижу, что событие получено, но приведенный выше код блокирует!


person Samet S.    schedule 10.05.2011    source источник
comment
Вам нужно будет привести пример рабочего кода, чтобы люди могли вам помочь.   -  person Nathan    schedule 10.05.2011
comment
Это полностью зависит от кода, который вы написали. Предоставление примера кода улучшит качество вопроса и позволит другим увидеть, где вы, возможно, ошиблись. На данный момент ваш вопрос слишком расплывчатый и вы вряд ли получите на него ответ.   -  person James Hay    schedule 10.05.2011


Ответы (1)


Ваш пример кода выглядит хорошо для меня, хотя использование оператора Take(1) приведет к перехвату только первого события, после которого поток завершится, и вы не получите никаких дополнительных уведомлений. Вы намерены прослушивать только одно уведомление о событии?

Возможно, удаление Take(1) даст вам правильное поведение?

private void UpdateList(Client client)
{
    var listUpdateReceive = Observable
        .FromEvent<ListEventArgs>(ev => client.ListUpdateReceive += ev, ev => client.ListUpdateReceive -= ev);

    listUpdateReceive.Subscribe(r =>
        {
           TraceInformation("List is updated.");

           OnListUpdateReceived(r.Sender, r.EventArgs);
        });
}
person James Hay    schedule 10.05.2011
comment
Проблема решена. Блокировка произошла из-за несинхронизированной (отсутствие блокировки) модификации строки. - person Samet S.; 10.05.2011