我想要一种将异步方法转换为 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)