保持任务活动并且所有订阅在没有旋转的情况下处于活动状态的正确方法是什么?

时间:2012-02-23 00:58:53

标签: multithreading task task-parallel-library system.reactive reactive-programming

我有以下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.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)
            }
   }

问题是什么是保持任务活着并且所有订阅在没有旋转的情况下处于活动状态的最佳方式?

1 个答案:

答案 0 :(得分: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.
    }

}

编辑: 如果你没有在这个线程上做任何定期的工作,那么只需使用WaitOne重载而没有超时参数。

token.WaitHandle.WaitOne();

将等待,直到取消令牌发出信号,然后继续。

EDIT2:

我刚看到你说你在可观察的订阅中有这个循环。它应该在您设置所有observables订阅之后,但不在每个实际订阅回调中(这些订阅将在调用源事件或可能的其他线程池线程的任何线程上运行,而不是设置订阅的任务线程) )。