gpt4 book ai didi

c# - 如何在C#/MVVM应用程序中解决无法解释的ObjectDisposedExceptions?

转载 作者:行者123 更新时间:2023-11-30 18:51:50 26 4
gpt4 key购买 nike

我已经写了我的第一个MVVM应用程序。当我关闭应用程序时,经常会由于ObjectDisposedException导致崩溃。当应用程序窗口消失后,崩溃将随着应用程序的死亡而出现。

获取stacktrace很困难(see my other question),但最终我做到了,发现我的stacktrace完全包含在C#库中(kernel32!BaseThreadStart,mscorwks!Thread,mscorwks!WKS等)。

此外,此崩溃是不一致的。在我最后一次 check out 并重建之后,它停止了……一段时间。然后它回来了。一旦开始发生,即使我“清理”并重建,它也会继续发生,。但是擦除和 check out 有时会使它停止一会儿。

我的想法:

我认为GarbageCollector在处理ViewModel时做得很有趣。我的ViewModelBase类析构函数有一个WriteLine来记录调用析构函数的时间,在我的4个ViewModel中,只有2个或3个被处置,并且它似乎因 checkout 而有所不同(例如,当我在我的 View 上运行它时,我会看到一致地重复顺序,但我的同事看到的是放置了不同对象的不同顺序)。

由于stacktrace中没有我的代码调用,因此我认为这不是我的代码在调用已处置对象的方法。这样就让我觉得CLR是愚蠢的。

这有意义吗?有什么办法可以使GC保持一致?这是红鲱鱼吗?

其他可能有用的详细信息:
我所有的Views和ViewModels都是在App.xaml.cs文件的Application的Startup事件处理程序中创建的。相同的处理程序将ViewModels分配给DataContexts。我不确定这是否是正确的MVVM做法(正如我说的,这是我的第一个MVVM应用程序),但是我不知道为什么它会导致不良行为。

如果需要,我可以粘贴代码。

最佳答案

您的应用程序引发异常,因为当主应用程序退出时,您对ViewModel销毁的日志记录操作尚未完成。

您会发现,为了执行实际的文件写入操作,会生成一个子进程。如果到主应用程序退出时还没有完成此操作,则会收到错误消息。

如果要执行此类操作,则需要主应用程序等待一段时间,以便所有子进程/线程池线程等在退出之前完成。

如果希望确保可以记录在应用程序关闭期间发生的事件,那么建议您将记录过程(实际写入日志文件)作为单独的主线程来运行,并向其发布消息。这样,您的应用程序可以在日志记录过程完成写入磁盘之前关闭。

关于c# - 如何在C#/MVVM应用程序中解决无法解释的ObjectDisposedExceptions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7824444/

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