1

У меня есть следующие TPL задачаКаков правильный способ сохранения активной задачи и всех подписчиков без вращения?

public abstract class AggregatorBase : IAggregator 
{ 

    public void Start(CancellationToken token) 
    { 
     var parent = Task.Factory.StartNew(x => 
     { 
      Aggregate(token); 
     },TaskCreationOptions.LongRunning, token); 

     parent.Wait(); 
    } 

    public abstract void Aggregate(CancellationToken ct); 
} 

в агрегированной реализации методы у меня есть ряд Observable.Subscription который заканчивается со следующим

public override void Aggregate(CancellationToken ct) 
    { 
      this.observables.Subscribe(// Do stuff); 
      this.observables.Subscribe(// Do more stuff); 

      while (!token.IsCancellationRequested) 
      { 
       System.Threading.Thread.Sleep(1000) 
      } 
    } 

Вопросом является, Что лучшим способом сохранить Целевую живой и все подписки активны без вращения?

+0

Я в замешательстве - почему вы вообще блокируете или спите, если используете Rx –

+0

Я думаю, что он означает, что он запускает задачу, эта задача устанавливает подписки Rx, но тогда он не хочет, чтобы эта задача продолжить и завершить. Поэтому он не блокирует внутри самих обратных вызовов подписки, а внутри задачи, которая устанавливает подписки. – Tyson

+0

@ Тайсон, но почему? Я согласен с Полом Бетцем. Похоже, что неправильное использование/непонимание Rx мне –

ответ

1

ожидания на ожидания ручки отмена маркера приводит:

while (!token.IsCancellationRequested) 
{ 
    if (token.WaitHandle.WaitOne(timeout)) 
    { 
     // cancelled. Don't have to do anything here, the above while 
     // loop will break now. 
    } 
    else 
    { 
     // ''timeout' period elapsed - do some periodic work here. 
    } 

} 

EDIT: , если у вас нет какой-либо периодической работы, чтобы сделать на этой теме, а затем просто использовать перегрузку WaitOne без параметра тайм-аута.

token.WaitHandle.WaitOne(); 

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

EDIT2:

Я только что прочитал, что вы сказали, что, что в то время как цикл в подписках Наблюдаемая х. Это должно быть сразу после того, как вы настроили все свои подписки на наблюдаемые данные, но не в каждом действительном обратном вызове подписки (эти подписки будут выполняться в любом потоке, вызванном исходными событиями или, возможно, другими потоками пулов потоков, а не потоком задачи, который настраивает подписки).

+0

У вас возникли проблемы с добавлением token.WaitHandle.WaitOne(); сразу после вызова Агрегата (токена), но в пределах делегирования действия задачи? –

+0

Нет, это должно работать нормально. – Tyson

 Смежные вопросы

  • Нет связанных вопросов^_^