【发布时间】:2015-07-13 06:31:08
【问题描述】:
我正在学习 RX,并希望使用 Console.ReadLine 作为可观察序列的来源。
我知道我可以使用“yield return”创建“IEnumerable”,但对于我的具体用例,我决定创建一个 C# 事件,以便潜在的许多观察者能够共享相同的键盘输入。
这是我的代码:
class Program
{
private delegate void OnNewInputLineHandler(string line);
private static event OnNewInputLineHandler OnNewInputLineEvent = _ => {};
static void Main(string[] args)
{
Task.Run((Action) GetInput);
var input = ConsoleInput();
input.Subscribe(s=>Console.WriteLine("1: " + s));
Thread.Sleep(30000);
}
private static void GetInput()
{
while (true)
OnNewInputLineEvent(Console.ReadLine());
}
private static IObservable<string> ConsoleInput()
{
return Observable.Create<string>(
(IObserver<string> observer) =>
{
OnNewInputLineHandler h = observer.OnNext;
OnNewInputLineEvent += h;
return Disposable.Create(() => { OnNewInputLineEvent -= h; });
});
}
}
我的问题 - 当我运行如上所示的 GetInput 方法时,第一行输入没有发送到序列(而是发送到事件处理程序)。
但是,如果我用以下版本替换它,一切都会按预期工作:
private static void GetInput()
{
while (true)
{
var s = Console.ReadLine();
OnNewInputLineEvent(s);
}
}
有人能解释一下为什么会发生这种情况吗?
【问题讨论】:
标签: events console system.reactive readline