【问题标题】:How to dispose unmanaged objects from static class in c#?如何在 C# 中从静态类中处理非托管对象?
【发布时间】:2017-11-17 19:02:52
【问题描述】:

我想从静态类中释放非托管资源。

我尝试了什么: 我已将课程设置为单例而不是静态的。 并添加了一个析构函数。但是非托管资源没有立即释放。因为析构函数不会像 dispose 那样被立即调用。

我没有实现 Idisposable,因为我无法从用户类调用 dispose 方法。

【问题讨论】:

  • 为什么静态类需要非托管资源?什么样的物体?
  • 我不确定有一个需要在单例或静态类中处理的非托管资源是一个好的设计......
  • “我已将类设为单例而不是静态。并添加了一个析构函数。但非托管资源没有立即释放。因为析构函数不会像 dispose 那样立即被调用” i> 我不明白。为什么你期望它立即被处理掉?每个静态成员(如单例)在卸载应用程序域时被释放,而不是在你完成它时。我很确定你的静态类应该在它们的静态方法中创建这些非托管资源,并注意它们会立即被释放(例如,使用using-statement)。
  • 这是一个 X/Y 问题。您的主要方法是错误的,现在您希望我们修复一个小细节。

标签: c# .net


【解决方案1】:

假设您有充分的理由在应用程序的生命周期内保留一个对象(请参阅 cmets 部分),您仍然不应该将其存储在静态变量中。相反,将其存储在代表应用程序生命周期的对象中;例如,在 Windows 窗体应用程序中,您可以将其存储为主窗体的成员变量,而在 Web 应用程序中,您可以将其存储为 HttpApplication (global.asax.cs) 的成员。表单和 Web 应用程序本身都是一次性的,因此您可以覆盖和扩展它们的 Dispose 方法并在那里处理您的非托管资源。当应用程序退出时,两个 Dispose 都将被隐式调用。

class MainForm : Form
{
    private readonly AutoResetEvent _global = new AutoResetEvent();

    public override void Dispose()
    {
        _global.Dispose();
        base.Dispose();
    }
}

【讨论】:

    猜你喜欢
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    • 2013-01-20
    • 1970-01-01
    • 2023-04-09
    • 2013-12-14
    相关资源
    最近更新 更多