【发布时间】:2022-01-13 19:23:08
【问题描述】:
我有一个 observable,我想用异步方法订阅这个 observable,但是每次异步方法抛出异常时,即使我将 catch 代码放在 observable 定义中,订阅也会立即处理。下面的伪代码演示了这种情况:
[Fact]
public async Task Test()
{
var observable = Observable.Create<int>(observer =>
{
try
{
Enumerable.Range(1, 10).ToList().ForEach(x =>
{
observer.OnNext(x);
});
}
catch (Exception ex)
{
// get called after the exception is thrown
_testOutputHelper.WriteLine($"The exception is catch:{ex.ToString()}");
}
return Disposable.Create(() =>
{
// also get called after exception is thrown
_testOutputHelper.WriteLine("Observable Dispose");
});
});
Func<int, Task> handler = async (i) =>
{
// simulate the handler logic
await Task.Delay(TimeSpan.FromSeconds(1));
// throw the exception to test
throw new Exception($"{i}");
};
observable.Subscribe(x=>handler(x).Wait());
await Task.Delay(TimeSpan.FromSeconds(10));
}
从上面的代码中,我不明白为什么即使捕获异常也会调用 dispose 委托(出于某种原因,我必须在可观察定义中处理异常),有什么办法可以防止订阅当异步方法抛出异常时处理?
【问题讨论】:
-
“处置委托”是什么意思?你的意思是对 Disposable.Create 的调用吗?
-
@TobiasKildetoft 是的!Disposable.Create 的动作委托被调用
-
它被调用是因为你吞下了异常而不是重新抛出它。出于以下所有代码的目的,可能从未抛出异常。
标签: c# .net async-await reactive-programming system.reactive