小编dgz*_*rgo的帖子

如何从控制台输入创建 IObservable<string>

我尝试编写控制台可观察的内容,如下例所示,但它不起作用。订阅存在一些问题。如何解决这些问题?

static class Program
{
    static async Task Main(string[] args)
    {
        // var observable = Observable.Interval(TimeSpan.FromMilliseconds(1000)).Publish().RefCount(); // works
        // var observable = FromConsole().Publish().RefCount(); // doesn't work
        var observable = FromConsole(); // doesn't work
        observable.Subscribe(Console.WriteLine);
        await Task.Delay(1500);
        observable.Subscribe(Console.WriteLine);
        await new TaskCompletionSource().Task;
    }

    static IObservable<string> FromConsole()
    {
        return Observable.Create<string>(async observer =>
        {
            while (true)
            {
                observer.OnNext(Console.ReadLine());
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我使用Observable.Interval,它会订阅两次,并且一个输入有两个输出。如果我使用任何版本的FromConsole,我都会有一个订阅和一个阻塞的线程。

c# console system.reactive observable

1
推荐指数
1
解决办法
704
查看次数

标签 统计

c# ×1

console ×1

observable ×1

system.reactive ×1