1

我遇到了析构函数问题。这是重现问题的代码:

class DPDemo : DependencyObject
{
    public DPDemo()
    {

    }

    ~DPDemo()
    {
        Console.WriteLine(this.Test);   // Cross-thread access
    }

    public int Test
    {
        get { return (int)GetValue(TestProperty); }
        set { SetValue(TestProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Test.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty TestProperty =
        DependencyProperty.Register("Test", typeof(int), typeof(DPDemo), new PropertyMetadata(0));
}

当析构函数运行时,我在行上得到一个 InvalidOperationException get {SetValue...。是否有推荐的方法从析构函数或其他线程中读取依赖属性?

4

2 回答 2

4

~ClassName()函数不是析构函数,它是终结器。它的作用与 C++ 析构函数完全不同。一旦您处于对象生命周期的终结器阶段,您就无法可靠地调用该类包含的其他对象,因为它们可能在调用终结器之前已经被销毁。您应该在终结器中做的唯一一件事是释放非托管资源或以正确实现的 dispose 模式调用 Dispose(false) 函数。

如果您需要“析构函数”,则需要正确实现 IDisposable 模式,以使您的代码以正确的方式运行。

另请参阅此问题和答案以获取有关编写良好 IDisposable 模式的更多提示,它还有助于解释为什么会出现错误(请参阅他开始谈论终结器的部分)。


回答您的评论:不,它没有。C# 没有在对象生命周期结束时自动可靠地调用函数的方法(IDisposable类 +using语句替换它)。如果您的对象实现IDisposable,则调用者有责任处置该对象。

在您的 WPF 应用程序的OnClose方法中,您将需要调用您的类的Save功能。你根本不需要你的班级IDisposable

//Inside the codebehind of your WPF form
public partial class MyWindow: Window
{
    //(Snip)

    protected override void OnClosed(EventArgs e) //You may need to use OnClosing insetad of OnClose, check the documentation to see which is more appropriate for you.
    {
        _DPDemoInstance.Save(); //Put the code that was in your ~DPDemo() function in this save function.
                                //You could also make the class disposeable and call "Dispose()" instead.
    }
}
于 2013-02-05T08:44:45.480 回答
0

我推荐使用 IDisposable 接口,并在 Dispose 方法中操作 DependencyObject。

于 2013-02-05T08:10:04.780 回答