ScheduledDisposable - PullRequest
       17

ScheduledDisposable

2 голосов
/ 28 сентября 2011

Что является хорошим примером / примером использования ScheduledDisposable в Reactive Rx

Мне нравится использование CompositeDisposable и SerialDisposable , но вам понадобится ScheduledDisposable .

1 Ответ

4 голосов
/ 29 сентября 2011

Логика использования одноразовых Rx заключается в том, что код, который выполняет какую-то операцию настройки, может возвращать IDisposable, который анонимно содержит код, который будет выполнять соответствующую очистку на более позднем этапе.Если этот шаблон используется последовательно, то вы можете составить много одноразовых изделий для выполнения одной операции очистки без каких-либо специальных знаний о том, что очищается.

Проблема заключается в том, что если этот код очистки необходимо запуститьто для определенного потока вам понадобится какой-то способ, чтобы Dispose вызывался в одном потоке для маршалинга в нужный поток - и вот тут ScheduledDisposable.

Основной пример - метод расширения SubscribeOn, который используетScheduledDisposable, чтобы гарантировать, что «отписаться» (т. Е. Dispose) выполняется на том же IScheduler, на котором был запущен Subscribe.

Это важно для метода расширения FromEventPatternНапример, он подключается к обработчикам событий и отсоединяется от них, что должно происходить в потоке пользовательского интерфейса.

Вот пример, где вы можете использовать ScheduledDisposable напрямую:

var frm = new SomeForm();

frm.Text = "Operation Started.";

var sd = new ScheduledDisposable(
    new ControlScheduler(frm),
    Disposable.Create(() =>
        frm.Text = "Operation Completed."));

Scheduler.ThreadPool.Schedule(() =>
{
    // Long-running task
    Thread.Sleep(2000);
    sd.Dispose();
});

Немногонадуманный, но он должен показать разумный пример того, как вы будете использовать ScheduledDisposable.

...