2015-07-01 17 views
0

在我的場景中,我實現了一個IObserver接口,通過方法輪詢特定變量的更新。我有一個線程是爲執行此方法而創建的。此線程現在不應該退出尋找更新某些數據。使用IObserver接口和AutoEventHandler/TaskCompletionSource等待事件

public static void findUpdates() 
{ 
    while(true) 
    { 
     CheckForUpdates(); //registered to the observer 
    } 
} 

然後我有多個線程進入類方法接收更新。

TaskCompletionSource<bool>updateHappened = new TaskCompletionSource<bool>(); 
object updatedValue; 

public async Task receiveUpdates(){ 

    while(true) 
    { 
     await updateHappened.Task; 
     //check to see if the thread cares about the updated value or not 
     //update or do not update and possibly terminate 
    } 

} 

,並在OnNext實施

public void OnNext(Object value){ 
    updatedHappened.SetResult(true); 
} 

的原因,我需要等待一個事件是因爲當我有線程進入我的while()循環是receiveUpdates如果他們不期待再有結束是可以調度的線程的最大數量,並且一些線程被阻止執行直到另一個線程退出。

這不正確的行爲現在它是我永遠不能通過await updateHappened.Task;無論我創建和發送多少個線程來接收更新。

我希望能夠讓線程想要接收更新,暫停執行在線程池中等待執行,以便其他線程(無論多少)也可以嘗試並接收更新,然後發生更新時一次恢復一個線程,並在再次暫停之​​前更新或不更新。一個線程將始終使用IObserver接口輪詢更新,但其他嘗試接收更新的線程將始終繼續查找更新,除非它在條件下退出。

+1

這很奇怪。 'await'應該使外部函數返回任務並釋放線程。我認爲問題在於你如何調用'receiveUpdates'。你是否也檢查過「OnNext」被執行? – Nitram

回答

2

A TaskCompletionSource<T>只能完成一次;這是一個單發信號,就是這樣。

由於您已經在使用Rx,因此請考慮讓源線程使用PublishConnect/RefCount來暴露其可觀察項。這將允許多個訂戶接收相同的數據。然後對於只想要await的線程,請使用await sequence.FirstAsync()

+0

你能指點我一個sequence.FirstAsync()的例子,或使用Rx的await嗎?在ISubject <>對象上找不到.FirstAsync()方法 – Pipeline

+0

它在System.Reactive.Linq.Observable中定義 - 只需確保您有最近的Rx版本。 –