|
1
1
尝试在C#中使用不安全模式,在堆上创建内容,并在完成后将其删除。另一个想法是将对资源的引用存储在匿名方法之外的变量中,并在程序终止时正确关闭它们。然后,您可能需要的只是调用Dispose()。 多一点信息会有所帮助。何时抛出异常?你所说的资源和“正确关闭”是什么意思 |
|
|
2
2
从你的描述中不太可能知道这一点,但也许你有一个COM对象,它包含对C#对象的引用,因为这些对象上的方法被登记为COM对象上公开的事件的事件处理程序,当COM对象不再使用时,它就会最终确定。假设COM对象是基于“公寓”的,这意味着一条消息将从终结器线程发布到创建COM对象的线程的Windows消息队列,请求对COM对象调用Release。此时,COM对象可能会对实现任何已登记事件处理程序的C#对象调用Release。当应用程序的最后一个托管代码运行完毕时,这一切都可能发生,因此CLR正在尝试卸载自身。可能是在关机期间,CLR必须通过允许在对象的引用计数降至零之前收集对象或将其置于无效状态来应对任何可能的引用计数泄漏。所以这可能(纯粹的猜测)解释了你所看到的。
如果是这样,您需要在自己选择的时间关闭COM对象。解决方案是致电
根据更新的问题进行更新: 好的,匿名方法闭包引用了一些COM对象。这些COM对象只会调用Release。如果这导致了问题,很可能是因为它们已经处于无效状态。
因此,我建议,当您创建一组包含对COM对象的引用的匿名方法闭包时,您还应该将这些COM对象添加到单独的列表中。这将允许您拨打电话
|
|
|
3
1
如果你真的想的话,你需要挂接到应用程序退出事件。但是,我认为做得更好会更好。 你使用匿名方法是为了什么?你能计算出它最后一次使用的时间,然后处理COM对象吗?你能让匿名方法获取COM对象吗 和 把它们都放在同一个街区内? 正如你所看到的,魔鬼在细节中:) |
|
|
user2414250 · 如何判断资源是否处于非托管状态? 8 年前 |
|
|
J.Lucas · 处置方法的重要性(libgdx) 8 年前 |
|
|
1iveowl Diego Sanchez · 异步一次性创建 8 年前 |
|
|
Czeshirecat · 在更改控件的字体时,是否应丢弃旧字体? 11 年前 |
|
|
user2813889 · 从列表中删除对象后,我应该将其更改为Null吗? 12 年前 |
|
|
Zerowalker · 如果我在整个跑步过程中都需要一次性物品,该怎么办? 12 年前 |