c# - 计时器回调关闭 WPF 应用程序(DispatcherTimer 工作..)

标签 c# .net wpf .net-4.0 timer

我有一个带有显示当前时间的文本 block 的 WPF 应用程序。所述文本 block 绑定(bind)到 ViewModel 上的 DependencyProperty。当然我需要不断更新时间,所以我使用了一个定时器(System.Threading.Timer),如下所示:

public MainViewModel()
{
    _dateTimer = new Timer(_dateTimer_Tick, null, 0, 60000);
}

void _dateTimer_Tick(object sender)
{
    Time = DateTime.Now.ToString("HH:mm");
    Date = DateTime.Now.ToString("D");
}

问题是,当回调被调用时,应用程序退出...真可惜(输出显示:“WindowsBase.dll 中出现类型为‘System.InvalidOperationException’的第一次机会异常”,就在它即将写入时间 DP)。

如果我使用 DispatcherTimer,一切正常。我不介意使用 DispatcherTimer,只是该应用程序非常大,我想尽我所能调整它的性能。据我所知,我没有访问 UI 线程(我只是更新一个属性),因此不需要 DispatcherTimer。

我错过了什么吗?

谢谢。

编辑: 属性定义如下:

    public string Time
    {
        get { return (string)GetValue(TimeProperty); }
        set { SetValue(TimeProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Time.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty TimeProperty =
        DependencyProperty.Register("Time", typeof(string), typeof(MainViewModel), new UIPropertyMetadata(""));

(日期相同)

最佳答案

定时器回调在非 UI 线程的线程上执行,这会导致问题;尽管您“只更新属性”,但发生这种情况的原因是因为这样的调用会创建一个调用链,即通知感兴趣的各方对属性的更改,在这种情况下是 UI,因此作用域会冒泡,导致不适当的跨线程调用。

为了解决这个问题,您可以在计时器构造函数中指定 WindowDispatcher 作为 state 参数的参数,然后使用 Dispatcher.Invoke

例如...

public MainViewModel()
{
    _dateTimer = new Timer(_dateTimer_Tick, Dispatcher, 0, 60000);
}

void _dateTimer_Tick(object state)
{
    ((Dispatcher)state).Invoke(UpdateUI);
}

void UpdateUI()
{
    Time = DateTime.Now.ToString("HH:mm");
    Date = DateTime.Now.ToString("D");
}

编辑:

使用 DispatcherTimer,正如 Henk 所建议的,甚至是您自己考虑的,很可能是去这里的方法,但是 - 我只是不知道类型,因此不在我的回答中证明的位置。关于 DispatcherTimer 和性能,您的担忧基于什么?

关于c# - 计时器回调关闭 WPF 应用程序(DispatcherTimer 工作..),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4886351/

相关文章:

c# - OData IQueryable 是异步的吗?

C# 将图像写入 ziarchive

c# - 什么时候应该在 C# 中使用 as 关键字

.net - 如何清除 .NET 中文件的只读标志?

c# - MVVM ViewModel 和静态方法

c# - txt 文件读取/覆盖/追加。这可行吗? (视觉 C#)

c# - 如何将数据从 texboxes 插入到 datagridview?

C#类格式将json数据发送到android应用程序

c# - 处理 ViewModels 和 CanExecute 处理程序

c# - 分开持有项目部分是一种好方式吗