Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从不同线程读取DependencyProperty_C#_Dependency Properties_Finalizer - Fatal编程技术网

C# 从不同线程读取DependencyProperty

C# 从不同线程读取DependencyProperty,c#,dependency-properties,finalizer,C#,Dependency Properties,Finalizer,我遇到了析构函数问题。下面是重新处理问题的代码: class DPDemo : DependencyObject { public DPDemo() { } ~DPDemo() { Console.WriteLine(this.Test); // Cross-thread access } public int Test { get { return (int)GetValue(TestPr

我遇到了析构函数问题。下面是重新处理问题的代码:

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行上得到一个InvalidOperationException{SetValue….是否有推荐的方法从析构函数或其他线程读取依赖性属性?

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

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

Am函数不是析构函数,它是一个终结器。它的任务与C++析构函数不同。一旦你在对象生命周期的终结器阶段,你就不能可靠地调用其他类包含的对象,因为它们可能在你的终结器被调用之前就已经被销毁了。zer正在以正确实现的dispose模式释放非托管资源或调用DisposeValse函数

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

另请参阅,以获取有关编写好的IDisposable模式的更多提示,这也有助于解释为什么会出现错误。请参阅他开始谈论终结器的部分

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

在WPF应用程序的OnClose方法中,您需要调用类的Save功能。您根本不需要类是可识别的

<> >类名称函数不是析构函数,它是终结器。它的工作与C++析构函数不同。一旦你进入对象生命周期的终结器阶段,你就不能可靠地调用类中包含的其他对象,因为它们可能在调用终结器之前已经被销毁。终结器中的ng是释放非托管资源或以正确实现的dispose模式调用DisposeValse函数

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

另请参阅,以获取有关编写好的IDisposable模式的更多提示,这也有助于解释为什么会出现错误。请参阅他开始谈论终结器的部分

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

在WPF应用程序的OnClose方法中,您需要调用类的Save功能。您根本不需要类是可识别的


是的,当你在析构函数中时,你不能保证你的任何CLR对象都是活动的。这不是我遇到的问题。依赖属性仍然是活动的,只是不喜欢从析构函数线程调用。我不能调用App.Dispatcher.Invoke,因为它在我之前被处理。是的,当你在在析构函数中,无法保证任何CLR对象都处于活动状态。这不是我遇到的问题。依赖项属性仍然处于活动状态,只是不喜欢从析构函数线程调用。我无法调用App.Dispatcher.Invoke,因为它在我之前被释放。在我之前是否会自动调用Dispose程序已关闭?我需要读取依赖项属性,以便在关闭WPF应用程序之前保存内容。是否在关闭程序之前自动调用Dispose?我需要读取依赖项属性,以便在关闭WPF应用程序之前保存内容。
//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.
    }
}