C# 使用IObserver接口和AutoEventHandler/TaskCompletionSource等待事件
在我的场景中,我实现了一个IObserver接口,通过一个方法轮询特定变量的更新。我有一个线程是为了执行这个方法而创建的。这个线程现在永远不应该停止寻找某些数据的更新C# 使用IObserver接口和AutoEventHandler/TaskCompletionSource等待事件,c#,multithreading,events,async-await,observer-pattern,C#,Multithreading,Events,Async Await,Observer Pattern,在我的场景中,我实现了一个IObserver接口,通过一个方法轮询特定变量的更新。我有一个线程是为了执行这个方法而创建的。这个线程现在永远不应该停止寻找某些数据的更新 public static void findUpdates() { while(true) { CheckForUpdates(); //registered to the observer } } 然后,我有多个线程进入一个类方法来接收更新 TaskCompletionSource&l
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
}
}
我需要等待事件的原因是,当我让线程进入while()循环is receiveUpdates时,如果它们没有被等待,那么最终会有一个最大数量的线程可以调度,并且一些线程被阻止执行,直到另一个线程退出
这是不正常的行为,现在和它我永远无法通过等待更新happed.Task;行,无论我创建了多少线程并通过发送来接收更新
我希望能够让希望接收更新的线程通过,暂停线程池中等待执行的执行,以便其他线程(无论多个)也可以尝试接收更新,然后当更新发生时,每次恢复每个线程,并在再次暂停之前更新或不更新它。一个线程将始终使用IObserver接口轮询更新,但尝试接收更新的每个其他线程将始终继续查找更新,除非它在某个条件下退出。a
TaskCompletionSource
只能完成一次;这是一个单发信号,就是这样
<> P>因为您已经使用RX,请考虑使源线程公开其可观察到的“代码>发布< /代码>和<代码> Connect /<代码> ReCuth.< /Cord>。这将允许多个订户接收相同的数据。然后,对于只想等待的线程,使用
await sequence.FirstAsync()
这很奇怪<代码>等待应使用外部函数返回任务并释放线程。我认为问题在于如何调用receiveUpdates
。您还检查了OnNext
是否被执行了吗?您能给我举一个sequence.FirstAsync()的例子,或者使用wait with Rx吗?在System.Reactive.Linq.Observable
中定义的ISubject对象上找不到.FirstAsync()方法-请确保您有最新的Rx版本。
public void OnNext(Object value){
updatedHappened.SetResult(true);
}