-1

我想知道为什么Observable当我不等待它的来源时我没有产生任何元素IAsyncEnumerable。我正在使用 a Selectover the Observable,并且没有任何结果,我的代码没有执行。


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 的引用,或者应该如何做到这一点?

4

1 回答 1

1

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

当您await隐式订阅了 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。希望它有意义吗?

于 2021-08-20T10:50:28.937 回答