gpt4 book ai didi

c# - 快速重复 TakeWhile 导致无限循环

转载 作者:太空狗 更新时间:2023-10-29 21:55:20 27 4
gpt4 key购买 nike

如何使以下可观察重复,直到 stream.DataAvailable 为 false?目前看起来它永远不会停止。

Defer 部分内的 AsyncReadChunk 和 Observable.Return 先调用 OnNext,然后调用 OnCompleted。当 Repeat 收到 OnNext 调用时,它会将其传递给 TakeWhile。当 TakeWhile 不满足时,它会完成 observable,但我认为 OnNext 之后的 OnCompleted 非常快,以至于 Repeat 重新订阅 observable 并导致无限循环。

我该如何纠正这种行为?

public static IObservable<byte[]> AsyncRead(this NetworkStream stream, int bufferSize)
{
return Observable.Defer(() =>
{
try
{
return stream.DataAvailable ? AsyncReadChunk(stream, bufferSize) : Observable.Return(new byte[0]);
}
catch (Exception)
{
return Observable.Return(new byte[0]);
}
})
.Repeat()
.TakeWhile((dataChunk, index) => dataChunk.Length > 0);
}

最佳答案


self 回答:(以下是问题作者 Samet 发布的答案。但是,他将答案作为问题的一部分发布。我将其移至单独的答案中,标记为社区 wiki,因为作者自己没有移动它。)


我通过重构发现这是调度器的问题。 Return 使用 Immediate 调度程序,而 Repeat 使用 CurrentThread。固定代码如下。

    public static IObservable<byte[]> AsyncRead(this NetworkStream stream, int bufferSize)
{
return Observable.Defer(() =>
{
try
{
return stream.DataAvailable ? AsyncReadChunk(stream, bufferSize) : Observable.Return(new byte[0], Scheduler.CurrentThread);
}
catch (Exception)
{
return Observable.Return(new byte[0], Scheduler.CurrentThread);
}
})
.Repeat()
.TakeWhile((dataChunk, index) => dataChunk.Length > 0);
}

关于c# - 快速重复 TakeWhile 导致无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8284300/

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