在我的場景中,我實現了一個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接口輪詢更新,但其他嘗試接收更新的線程將始終繼續查找更新,除非它在條件下退出。
這很奇怪。 'await'應該使外部函數返回任務並釋放線程。我認爲問題在於你如何調用'receiveUpdates'。你是否也檢查過「OnNext」被執行? – Nitram