Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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# Dispose或kill Dispatchermer对象和访问Dispatchermer对象_C#_Wpf_Uwp_Dispatchertimer - Fatal编程技术网

C# Dispose或kill Dispatchermer对象和访问Dispatchermer对象

C# Dispose或kill Dispatchermer对象和访问Dispatchermer对象,c#,wpf,uwp,dispatchertimer,C#,Wpf,Uwp,Dispatchertimer,问题1: 您好,我想知道是否有一种方法可以处置或杀死Dispatchermer的对象,并创建一个同名的新对象 问题2: 如果Dispatchermer对象设置为Public,我可以访问其他类中的Dispatchermer对象吗 无法处置Dispatchermer对象。它没有实现IDisposable接口。您不能在托管世界中显式杀死(释放、销毁)对象。 如果不再需要计时器对象,请禁用它并将对它的引用设置为null。稍后将由GC收集。 通过设置IsEnabled=false或调用timer.stop

问题1: 您好,我想知道是否有一种方法可以处置或杀死Dispatchermer的对象,并创建一个同名的新对象

问题2: 如果Dispatchermer对象设置为Public,我可以访问其他类中的Dispatchermer对象吗

  • 无法处置Dispatchermer对象。它没有实现IDisposable接口。您不能在托管世界中显式杀死(释放、销毁)对象。 如果不再需要计时器对象,请禁用它并将对它的引用设置为null。稍后将由GC收集。 通过设置IsEnabled=false或调用
    timer.stop()
    ,可以禁用或停止计时器。效果是一样的
  • 对。我想你有这样的公共财产:

    public dispatchermer MyTimer{get;private set;}


  • 添加到Lubo的正确答案(并从下面的评论中提出此主题):即使您无法处理Dispatchermer(很可能是因为它连接到WPF/UWP Dispatcher本身的非托管部分,与应用程序本身一样长),您仍然应该取消订阅其事件

    比方说,如果您有某个方法(StartRefreshTimer),在该方法中初始化了Dispatcher并开始侦听其Tick事件:

    然后,您应该有一个停止计时器并取消订阅其事件的方法:

    private void StopRefreshTimer()
    {
        if (_refreshTimer != null)
        {
            _refreshTimer.Stop(); // stop timer
            _refreshTimer.Tick -= OnTick; // unsubscribe from timer's ticks
        }
    }
    

    您应该确保在类超出范围时(例如,当您的WPF/UWP控件或ViewModel被卸载时)调用此“分解”方法。如果不取消订阅计时器事件,可能会导致内存泄漏,这是由外部作用域对计时器宿主类的引用引起的。

    是的,停止计时器工作正常,但我很想知道我是否可以如何处理它。。。。我一直在努力工作,这是无法设定的。timer.stop不处理勾号事件。即使将Dispatchermer分配给一个新的Dispatchermer,我仍然会收到重复的tick事件。该问题用WPF标记。这就是为什么我在回答中从WindowsBase程序集中引用System.Windows.Threading.Dispatchermer类,而不是从Windows运行时API引用Windows.UI.Xaml.Dispatchermer。@SyaifulNizamYahya这就是为什么我使用
    myTimer1.Tick-=OnTimerTick\u Move;myTimer1.Tick+=新事件处理程序(OnTimerTick\u Move)
    计时器将多次启动以取消连接事件处理程序,或者您可以在调用
    myTimer1.Stop()时执行此操作@vinsa从处理程序中解列是智能的。你的代码会在最后一次解压吗?
    
    private void StopRefreshTimer()
    {
        if (_refreshTimer != null)
        {
            _refreshTimer.Stop(); // stop timer
            _refreshTimer.Tick -= OnTick; // unsubscribe from timer's ticks
        }
    }