Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用IObserver接口和AutoEventHandler/TaskCompletionSource等待事件_C#_Multithreading_Events_Async Await_Observer Pattern - Fatal编程技术网

C# 使用IObserver接口和AutoEventHandler/TaskCompletionSource等待事件

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

在我的场景中,我实现了一个IObserver接口,通过一个方法轮询特定变量的更新。我有一个线程是为了执行这个方法而创建的。这个线程现在永远不应该停止寻找某些数据的更新

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