【问题标题】:Why does observable not produce any element为什么 observable 不产生任何元素
【发布时间】:2021-08-17 09:55:45
【问题描述】:

我想知道为什么我的Observable 在我不等待它的来源(即IAsyncEnumerable)时不会产生任何元素。我在Observable 上使用Select,但没有任何结果,我的代码没有执行。


public async IAsyncEnumerable<int> GetAsyncEnumerable()
{
    int i=0;
    while(true)
    {
       await Task.Delay(1000);
       yield return i++;
    }
}
public async Task Run()
{
    IAsyncEnumerable<int> enumerable=GetAsyncEnumerable().ToObservable();

    await foreach(var elem in enumerable)
    {
            Console.WriteLine(elem);
    }
}

在上面的例子中,代码工作并被调用,而下面没有任何输出。

public async Task RunObs()
{
    IAsyncEnumerable<int> enumerable=GetAsyncEnumerable().ToObservable();
    IObservable<int> inputObs = enumerable.ToObservable();
    var outputObs = inputObs
                    .Select(elem=>
                    { 
                        Console.WriteLine(elem); //does not execute
                        return elem;
                    });
}

我是否需要在某处存储对这个 observable 的引用,或者应该如何做到这一点?

【问题讨论】:

  • 能否为您的Run 方法提供一个minimal reproducible example
  • 我已经编辑过了。基本上在Select 中运行的带有可观察对象的代码不会被执行。
  • 你的代码给了我这个错误,在Run()的第一行:Error CS0266 Cannot implicitly convert type 'System.IObservable&lt;int&gt;' to 'System.Collections.Generic.IAsyncEnumerable&lt;int&gt;'. An explicit conversion exists (are you missing a cast?)
  • 你从哪里得到.ToObservable()
  • 我从包裹System.Linq.Async得到它

标签: .net-core scope system.reactive iasyncenumerable


【解决方案1】:

observable 不会产生任何元素,因为您需要订阅它才能获取它们。

当你 await 一个 observable 时,你隐式订阅了 observable,当 observable 完成或出错时,该方法将返回。如果完成,您将收到最后生成的值。

    var outputObs = await GetAsyncEnumerable()
                    .ToObservable()
                    .Select(elem =>
                    {
                        Console.WriteLine(elem); 
                        return elem;
                    })
                    .Take(5);
    Console.WriteLine(outputObs);

将输出 控制台上的0、1、2、3、4、4(当然每个数字在不同的行)

这也会导致 observable 产生输出:

    GetAsyncEnumerable()
                    .ToObservable()
                    .Take(5)
                    .Subscribe(elem =>
                    {
                        Console.WriteLine(elem);                        
                    });

0、1、2、3、4

因为现在你也订阅了 observable。 希望有意义吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-03
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 2011-11-25
    • 1970-01-01
    相关资源
    最近更新 更多