gpt4 book ai didi

c# - 使用 Rx 限制来自非异步调用的回调

转载 作者:行者123 更新时间:2023-11-30 22:38:52 25 4
gpt4 key购买 nike

我的问题类似于this问题,但一如既往地略有不同。

我目前从事的项目使用一种简单的模式来异步接收基础数据更改的通知。

Foo 类负责订阅这些数据变化,并为类提供一种方法,通过注册实现给定接口(interface)的类的实例来注册它们对这些变化的兴趣:

public Guid SubscribeToChanges(ISomeCallbackInterface callback)

Bar 类实现了这个回调并注册了自己:

public class Bar : ISomeCallbackInterface
{
...
//initialise instance of Foo class and subscribe to updates
_foo.SubscribeToChanges(this);
...

public void CallbackMethod(string id, IEnumerable<Tuple<string, int, object>> data)
{
...
}
}

理想情况下,我们希望限制这些回调,因为我们可以获得一个回调,该回调将特定数据片段的值从 x 更改为 y,然后在一秒内返回 x。查看 Rx 文档,使用 DistinctUntilChanged 运算符这将是微不足道的。

但是,问题是如何创建一个 IObservable 集合,然后我可以将运算符应用于上面给定的回调实现。文档非常清楚地说明了如何从标准 .Net 事件或 Begin.../End... 方法对创建 IObservable。

更新:正如 Richard Szalay 在他的评论中指出的那样,我需要将 DistinctUntilChanged 与 Throttle 结合使用才能实现我的需要。

再次感谢 Richard,我还应该提到我需要取消订阅回调的能力。在当前模型中,我只是在 Foo 的实例上调用 Unscubscribe(Guid subscriptionToken)。

最佳答案

我想到的唯一方法是使用 ISomeCallbackInterfaceObservable.Create 的自定义实现。尽管如此,解决方案还是让人感觉很吃力:

public static IObservable<Tuple<string,IEnumerable<Tuple<string, int, object>>> 
FromCustomCallbackPattern(ISomeCallbackPublisher publisher)
{
return Observable.CreateWithDisposable<T>(observer =>
{
var subject = new Subject<
Tuple<string,IEnumerable<Tuple<string, int, object>>>();

var callback = new ObservableSomeCallback(subject);

Guid subscription = publisher.SubscribeToChanges(callback);

return new CompositeDisposable(
subject.Subscribe(observer),
Disposable.Create(() => publisher.UnsubscribeFromChanges(subscription))
);
});
}

private class ObservableSomeCallback : ISomeCallbackInterface
{
private IObserver<Tuple<string,IEnumerable<Tuple<string, int, object>>> observer;

public ObservableSomeCallback(
IObserver<Tuple<string,IEnumerable<Tuple<string, int, object>>> observer)
{
this.observer = observer;
}

public void CallbackMethod(string id, IEnumerable<Tuple<string, int, object>> data)
{
this.observer.OnNext(new Tuple<
string,IEnumerable<Tuple<string, int, object>>(id, data));
}
}

关于c# - 使用 Rx 限制来自非异步调用的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5953362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com