恢复多播可观察量 [英] Resurrect multicast observables

查看:40
本文介绍了恢复多播可观察量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是使用Rx的商业系统中相当常见的模式(根据我的经验)。

This is a fairly common pattern (in my experience) in business systems using Rx.


class Cache
{
	private readonly Dictionary<string, IObservable<int>> _cache = new Dictionary<string, IObservable<int>>();
	
	public IObservable<int> Get<T>(string key)
	{
		lock(_cache)
		{
			IObservable<int> stream;
			if(!_cache.TryGetValue(key, out stream))
			{
				stream = Create(key).Multicast(new Subject<int>()).RefCount();
				_cache[key] = stream;
			}			
			return stream;
		}
	}
	
	private IObservable<int> Create(string key)
	{
		// get some observable based on the key
		throw new NotImplementedException();
	}
}

推荐答案

解决方案1 ​​


class Cache
{
	private readonly Dictionary<string, IObservable<int>> _cache = new Dictionary<string, IObservable<int>>();
	
	public IObservable<int> Get<T>(string key)
	{
		lock(_cache)
		{
			IObservable<int> stream;
			if(!_cache.TryGetValue(key, out stream))
			{
				stream = Create(key)
				.Do(x => { }, ex => 
				{
					// remove observable on error
					lock(_cache)
					{
						_cache.Remove(key);
					}
				})
				.Multicast(new Subject<int>()).RefCount();
				_cache[key] = stream;
			}			
			return stream;
		}
	}
	
	private IObservable<int> Create(string key)
	{
		// get some observable based on the key
		throw new NotImplementedException();
	}
}


这篇关于恢复多播可观察量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆