c# - 通过 Rx 正确使用多个资源
问题描述
我需要在 Rx 中使用多个一次性资源。这就是我嵌套Observable.Using
语句的方式(内部源代码仅用于测试)。
var obs = Observable.Using(
() => new FileStream("file.txt", FileMode.Open),
fs => Observable.Using(
() => new StreamReader(fs),
sr => Observable.Create<string>(o =>
TaskPoolScheduler.Default.ScheduleAsync(async (sch, ct) =>
{
while (!ct.IsCancellationRequested)
{
var s = await sr.ReadLineAsync().ConfigureAwait(false);
if (s is null) break;
o.OnNext(s);
}
o.OnCompleted();
}))));
obs.Subscribe(Console.WriteLine);
有没有更简洁的方式来use
处理多个一次性资源?
解决方案
我想不出use
无限数量的资源的通用方法,但至少您可以为 2-3 个资源的常见情况制作辅助方法。这是两个的实现:
public static IObservable<TResult> Using<TResult, TResource1, TResource2>(
Func<TResource1> resourceFactory1,
Func<TResource1, TResource2> resourceFactory2,
Func<TResource1, TResource2, IObservable<TResult>> observableFactory)
where TResource1 : IDisposable
where TResource2 : IDisposable
{
return Observable.Using(resourceFactory1, resource1 => Observable.Using(
() => resourceFactory2(resource1),
resource2 => observableFactory(resource1, resource2)));
}
使用示例:
var obs = Using(
() => new FileStream("file.txt", FileMode.Open),
(fs) => new StreamReader(fs),
(fs, sr) => Observable.Create<string>(o =>
TaskPoolScheduler.Default.ScheduleAsync(async (sch, ct) =>
{
while (!ct.IsCancellationRequested)
{
var s = await sr.ReadLineAsync().ConfigureAwait(false);
if (s is null) break;
o.OnNext(s);
}
o.OnCompleted();
})));
推荐阅读
- ios - 在 iOS 中调试时推送 viewController 不起作用
- excel - 合并后用工作簿名称命名工作表?
- python - python中声明方法(&self)的问题
- oracle12c - OBIEE 12c。在具有 XML 权限的标题中创建自定义链接
- ssl - 如何识别证书未知错误背后的原因
- javascript - 无法从 Promise 中检索数据
- kubernetes - 如何将 ConfigMap 配置与 Helm NginX Ingress 控制器一起使用 - Kubernetes
- npm - npm prune 移除依赖模块
- django - 无法分配“
class ProductDetailSlugview(ObjectViewedMixin, DetailView): queryset = Product.objects.all() template_name = "products/product_detail.html" def get_context_data(self, *args, **kwargs):
- r - 使用 write.table 创建包含逗号的字段的制表符分隔文件