gpt4 book ai didi

c# - 为什么代码会产生 ObjectDisposedException

转载 作者:行者123 更新时间:2023-11-30 20:26:09 24 4
gpt4 key购买 nike

static void Main(string[] args)
{
Observable.Using(() => new EventLoopScheduler(), els => Observable
.Defer(() => Observable.Return(1))
.SubscribeOn(els))
.Subscribe();
Console.ReadLine();
}

为什么上面的代码会产生一个ObjectDisposedException? SubscribeOn 究竟是如何工作的?


更多详情:

//can't compile
class DataService : ObservableBase<Unit>
{
protected override IDisposable SubscribeCore(IObserver<Unit> o)
{
return Observable.Defer(() => Observable.Start(() => _httpClient.Get(...)))
.RepeatWithDelay(TimeSpan.FromSeconds(1))
.ObserveOn(SchedulerEx.Current)//observe back to event loop
.Do(...)
.Select(_ => Unit.Default)
.Subscribe(o)
}
}
class Controller
{
void Start()
{
_instance = Observable.Using(
() => SchedulerEx.Create(),
els => _dataService.SubscribeOn(els));
}
void Stop()
{
_instance.Dispose();
}
}
class SchedulerEx
{
[ThreadStatic]
public static EventLoopScheduler Current;
public EventLoopScheduler Create()
{
var els = new EventLoopScheduler();
els.Schedule(() => SchedulerEx.Current = els);
return els;
}
}
static void Main()
{
var controller = kernel.Get<Controller>();
controller.Start();
controller.Stop();//throw if stop immediately
}

我想实现的是:在windows服务应用中,我有多个DataService独立运行在各自的事件循环中,我可以在任何地方观察回当前的事件循环。

最佳答案

这就是椒盐卷饼:

  • Observable.Using 类似于 C# using 语句:它在 observable 结束后释放一个 IDisposable
  • Observable.Defer 延迟运行包含的代码,直到订阅者订阅。
  • SubscribeOn 根据传入的 IScheduler 指示应在哪个线程上订阅 observable。

我测试了以下内容,它也被炸毁了:

static void Main(string[] args)
{
Observable.Using(() => new EventLoopScheduler(), els =>
Observable.Empty<int>()
.SubscribeOn(els)
)
.Subscribe();
}

...所以 Defer 没有影响。

显然 Using 是在调度程序被使用之前对其进行处理。如果您将 Observable.Empty(或 Observable.Return)更改为不会立即完成的内容(例如 Observable.Never Observable.Interval(TimeSpan.FromMilliseconds(100)).Take(2),那么就不会炸了。

它看起来像是 EventLoopScheduler 中的竞争条件错误:可能 Observable.UsingEventLoopScheduler 都试图调用 Dispose ,如果错误的第一个到达那里,炸毁。

我建议删除 Using

关于c# - 为什么代码会产生 ObjectDisposedException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50393554/

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