c# – 如何将阻塞事件转换为Observable?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 如何将阻塞事件转换为Observable?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1953字,纯文字阅读大概需要3分钟。
内容图文
我正在学习.net Rx(Reactive Extensions)库并尝试创建一个从Console读取用户输入的正确Observable.
到目前为止,我来到这里:
public static IObservable<string> ConsoleInputObservable()
{
return Observable.Create<string>(observer =>
{
var cancelable = new BooleanDisposable();
while(!cancelable.IsDisposed)
{
observer.OnNext(Console.ReadLine());
}
observer.OnCompleted();
return cancelable;
});
}
不幸的是,这个实现至少有一个问题 – 没有办法取消订阅它.
所以我的问题是:如何正确地将一系列阻塞事件转换为Observable?
谢谢.
编辑:错别字
解决方法:
干得好.
请注意以下几点:
>这允许用户提供适当的调度程序来控制并发运行的位置,并产生每个循环以防止它过于混乱(尽管等待控制台显然是非常粘性的…)
>我们不应该在此示例中调用OnCompleted,因为终止的唯一方法是取消订阅 – 并且您努力在取消后不再发送消息
>我们也不会在这里发送OnNext帖子取消.
这是代码:
public static IObservable<string> ConsoleInputObservable(
IScheduler scheduler = null)
{
scheduler = scheduler ?? Scheduler.Default;
return Observable.Create<string>(o =>
{
return scheduler.ScheduleAsync(async (ctrl, ct) =>
{
while(!ct.IsCancellationRequested)
{
var next = Console.ReadLine();
if(ct.IsCancellationRequested)
return;
o.OnNext(next);
await ctrl.Yield();
}
});
});
}
附录
@MartinLiversage评论说,多个订阅者的行为是不可取的 – 这促使了这个附录.您可以简单地发布()上面的代码,但鉴于控制台的性质是应用程序只有一个,并且一次只有一个线程可以读取它,因此需要采用不同的方法.
我忽略了这一点,因为我觉得问题可能更多是关于线程方面而不是控制台的本质.如果你真的对报告在控制台输入的行感兴趣,那么像下面这样的主循环可能会更实用 – 这代表了对主题的合理使用.
static void Main()
{
Subject<string> sc = new Subject<string>();
// kick off subscriptions here...
// Perhaps with `ObserveOn` if background processing is required
sc.Subscribe(x => Console.WriteLine("Subscriber1: " + x));
sc.Subscribe(x => Console.WriteLine("Subscriber2: " + x));
string input;
while((input = Console.ReadLine()) != "q")
{
sc.OnNext(input);
}
sc.OnCompleted();
Console.WriteLine("Finished");
}
内容总结
以上是互联网集市为您收集整理的c# – 如何将阻塞事件转换为Observable?全部内容,希望文章能够帮你解决c# – 如何将阻塞事件转换为Observable?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。