gpt4 book ai didi

c# - 如何处理 SelectMany 语句中异步方法的异常

转载 作者:太空狗 更新时间:2023-10-29 23:25:26 25 4
gpt4 key购买 nike

我正在尝试使用 Rx 异步处理一些任务,例如

var list = Enumerable.Range(0, 100)
.ToObservable()
.SelectMany(x => Observable.Start(() => {
Console.WriteLine("Processing {0} ...", x);

Thread.Sleep(100 * x % 3);

if (x > 90) {
Console.WriteLine("Procesing exception {0} > 90", x);
throw new Exception("Value too large");
}
Console.WriteLine("Processing {0} completed.", x);
return x;
}))
.Subscribe(
x => { Console.WriteLine("Next [{0}]", x); },
e => {
Console.WriteLine("Exception:");
Console.WriteLine(e.Message);
},
() => { Console.WriteLine("Complete"); }
);

我在这段代码中遇到的问题是异常没有传递给订阅者。因此,经过大量尝试后,我放弃并决定问这个简单的问题:

如何处理 SelectMany 语句中的异步方法引发的异常?

需要说明的是,最终实现是一个同步函数调用,可能会或可能不会抛出异常。目标是将其传递给订阅者,以便对其进行进一步处理(在特定情况下,将向用户显示一条消息)。

编辑

我将我的发现向下移动到一个答案,这样我就可以将这个问题标记为已回答。就个人而言,我不同意 self 回答......但有时没有其他办法,很抱歉。

最佳答案

使用 Materialize 将您的 OnError/OnCompleted 消息转换为通知。

例如,

observable.SelectMany(x => Observable.Start(fn).Materialize())

将使您获得包含在通知中的错误/完成,以便在您的实际订阅点中进行处理,而不是在 SelectMany 中终止错误。

这对于大多数异步调用操作很有用,因为该方法要么失败要么完成。

关于c# - 如何处理 SelectMany 语句中异步方法的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9574996/

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