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

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

问题是保持任务活动和所有订阅活动而不旋转的最佳方法是什么?

4

1 回答 1

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();

这将无限期地等待,直到发出取消令牌的信号,然后继续。

编辑2:

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

于 2012-02-23T01:04:40.407 回答