相关疑难解决方法(0)

从定期异步请求创建可观察对象

我想要一种将异步方法转换为 observable 的通用方法。就我而言,我正在处理用于HttpClient从 API 获取数据的方法。

假设我们有一个方法Task<string> GetSomeData()需要成为一个单一的方法,Observable<string>其中的值是作为以下组合生成的:

  • 重复定期调用GetSomeData()(例如每 x 秒)
  • GetSomeData()在任何给定时间手动触发调用(例如当用户点击刷新时)。

由于有两种方法可以触发GetSomeData()并发执行可能是一个问题。为了避免要求GetSomeData()线程安全,我想限制并发性,以便只有一个线程同时执行该方法。因此,我需要使用某种策略来处理重叠的请求。我做了一个(某种)大理石图来描述问题和想要的结果

大理石图

我的直觉告诉我有一个简单的方法可以实现这一点,所以请给我一些见解:)

这是我到目前为止的解决方案。不幸的是,它并没有解决并发问题。

    public class ObservableCreationWrapper<T>
    {
        private Subject<Unit> _manualCallsSubject = new Subject<Unit>();
        private Func<Task<T>> _methodToCall;
        private IObservable<T> _manualCalls;

        public IObservable<T> Stream { get; private set; }

        public ObservableCreationWrapper(Func<Task<T>> methodToCall, TimeSpan period)
        {
            _methodToCall = methodToCall;
            _manualCalls = _manualCallsSubject.AsObservable()
                .Select(x => Observable.FromAsync(x => methodToCall()))
                .Merge(1);

            Stream = Observable.FromAsync(() => _methodToCall())
                .DelayRepeat(period)
                .Merge(_manualCalls);
        }

        public void TriggerAdditionalCall() …
Run Code Online (Sandbox Code Playgroud)

c# asynchronous system.reactive rx.net

6
推荐指数
1
解决办法
407
查看次数

标签 统计

asynchronous ×1

c# ×1

rx.net ×1

system.reactive ×1