gpt4 book ai didi

c# - 使用 'yield return' 观察异步序列

转载 作者:太空狗 更新时间:2023-10-30 00:43:58 25 4
gpt4 key购买 nike

以下示例工作正常:

static IEnumerable<int> GenerateNum(int sequenceLength)
{
for(int i = 0; i < sequenceLength; i++)
{
yield return i;
}
}

static void Main(string[] args)
{

//var observ = Observable.Start(() => GenerateNum(1000));
var observ = GenerateNum(1000).ToObservable();

observ.Subscribe(
(x) => Console.WriteLine("test:" + x),
(Exception ex) => Console.WriteLine("Error received from source: {0}.", ex.Message),
() => Console.WriteLine("End of sequence.")
);

Console.ReadKey();
}

但是,我真正想要的是使用注释掉的行——即我想异步运行“数字生成器”,每次它产生一个新值时,我都希望将它输出到控制台。它似乎不起作用 - 我如何修改此代码才能起作用?

最佳答案

在控制台应用程序中为异步执行执行此操作时,您可能需要使用 ToObservable(IEnumerable<TSource>, IScheduler)过载(参见 Observable.ToObservable Method (IEnumerable, IScheduler) )。例如,要使用内置的线程池调度,请尝试

var observ = GenerateNum(1000).ToObservable(Scheduler.ThreadPool);

它对我有用...为了扩展,下面的完整示例完全按照我认为您的意图工作:

    static Random r = new Random();

static void Main(string[] args) {

var observ = GenerateNum(1000).ToObservable(Scheduler.ThreadPool );

observ.Subscribe(
(x) => Console.WriteLine("test:" + x),
(Exception ex) => Console.WriteLine("Error received from source: {0}.", ex.Message),
() => Console.WriteLine("End of sequence.")
);

while (Console.ReadKey(true).Key != ConsoleKey.Escape) {
Console.WriteLine("You pressed a key.");
}
}

static IEnumerable<int> GenerateNum(int sequenceLength) {
for (int i = 0; i < sequenceLength; i++) {
Thread.Sleep(r.Next(1, 200));
yield return i;
}
}

关于c# - 使用 'yield return' 观察异步序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9132466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com