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 – 2012-02-23 02:16:41

+0

,你爲什麼會阻塞或睡覺?我認爲他意味着他開始了一項任務,該任務設置了Rx訂閱,但是他不希望該任務繼續和'完成'。所以他不會在訂閱回調中自行阻止,而是在設置訂閱的任務中。 – Tyson 2012-02-23 04:41:43

+0

@泰森,但爲什麼?我同意Paul Betts。這似乎是對我的誤用/誤解Rx – 2012-07-06 14:37:12

回答

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:

我剛纔讀的,你說你有,雖然觀察到的訂閱內循環。它應該在您設置了所有可觀察的訂閱之後,而不是在每個實際的訂閱回調中(這些訂閱將在任何調用源事件或可能的其他線程池線程的線程上運行,而不是設置訂閱的任務線程)。

+0

你可以看到任何問題添加token.WaitHandle.WaitOne();在調用Aggregate(token)之後,但在Task action委託中? – 2012-02-23 12:13:25

+0

不,應該可以正常工作。 – Tyson 2012-02-23 13:40:50

相關問題