Как правильно сохранить задание живым, а все подписки активными без вращения? - PullRequest
1 голос
/ 23 февраля 2012

У меня есть следующая задача 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);
}

в реализациях метода Aggregate. У меня есть несколько Observable. Подписка заканчивается следующим:

   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)
            }
   }

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

1 Ответ

1 голос
/ 23 февраля 2012

wait для маркера ожидания токена отмены:

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 без параметра timeout.

token.WaitHandle.WaitOne();

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

EDIT2:

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

...