从不同线程读取DependencyProperty

本文关键字:读取 DependencyProperty 线程 | 更新日期: 2023-09-27 17:57:31

我有析构函数问题。以下是修复问题的代码:

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));
}

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

从不同线程读取DependencyProperty

~ClassName()函数不是析构函数,而是终结器。它提供的工作与C++析构函数截然不同。一旦您处于对象生命周期的终结器阶段,您就无法可靠地调用类包含的其他对象,因为它们可能在调用终结器之前已经被销毁。在终结器中,您唯一应该做的就是释放非托管资源,或者在正确实现的处置模式中调用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.
    }
}

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