У меня есть следующий бит кода для настройки моих подключений Rx:
Определения, связанные с событием:
public class QueryEventArgs : EventArgs
{
public SomeParametersType SomeParameters
{
get;
set;
}
public object QueryContext
{
get;
set;
}
};
public delegate void QueryDelegate(object sender, QueryEventArgs e);
public event QueryDelegate QueryEvent;
Инициализация:
queryObservable = Observable.FromEvent<QueryEventArgs>(this, "QueryEvent");
queryObservable.Subscribe((e) =>
{
tbQueryProgress.Text = "Querying... ";
client.QueryAsync(e.EventArgs.SomeParameters, e.EventArgs.QueryContext);
});
queryCompletedObservable = from e in Observable.FromEvent<QueryCompletedEventArgs>(client, "QueryCompleted").TakeUntil(queryObservable) select e;
queryCompletedObservable.Subscribe((e) =>
{
tbQueryProgress.Text = "Ready";
SilverlightClientService_QueryCompleted(e.Sender, e.EventArgs);
},
(Exception ex) =>
{
SetError("Query error: " + ex);
}
);
«клиент» - это клиент WCF, а все остальное довольно очевидно.
«TakeUntil» предназначен для того, чтобы пользователь не давил себе, когда выполняет новый запрос, находясь в середине текущего запроса. Однако, хотя код работает, если я удаляю предложение TakeUntil, если я его вставляю, запрос никогда не завершается.
Это правильный шаблон? Если так, я делаю что-то не так?
Ура,
-Tim