gpt4 book ai didi

c# - DispatcherTimer 未在 wpf 应用程序中触发

转载 作者:太空狗 更新时间:2023-10-30 01:05:41 24 4
gpt4 key购买 nike

我最近重构了我的 WPF 代码,现在我的 DispatcherTimer 停止触发了。我在这里检查了其他类似的帖子,但它们似乎都是设置了错误的调度程序线程的问题,我试过了......

我的代码是这样的:

class MainWindow : Window
{
private async void GoButton_Click(object sender, RoutedEventArgs e)
{
Hide();

m_files = new CopyFilesWindow();
m_files.Show();

m_dispatcherTimer = new DispatcherTimer();
m_dispatcherTimer.Tick += dispatcherTimer_Tick;
m_dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 250);
m_dispatcherTimer.Start();

await SomeLongRunningTask();

m_files.Hide();
Show();
}

(当前类是我的主要 Window 对象,我在文件复制期间隐藏它。CopyFilesWindow 是一个简单的 Xaml 窗口,其中包含我修改的控件...CopyFilesWindow 本身什么都不做。)

基本上,我等待一个长时间运行的任务(复制一堆大文件),我的 DispatcherTimer 应该更新 dispatcherTimer_Tick 中的进度。但是,我在该函数上设置了一个断点,它没有被命中。

我也试过像这样用构造函数设置 Dispatcher:

        m_dispatcherTimer = new DispatcherTimer(DispatcherPriority.Normal, m_files.Dispatcher);
m_dispatcherTimer = new DispatcherTimer(DispatcherPriority.Normal, this.Dispatcher);

但是这些都没有改变行为......它仍然没有触发。

我在这里做错了什么?

最佳答案

DispatcherTime 在 ... Dispatcher 线程上运行。正在等待 SomeLongRunningTask() 完成。

确实,当您按下按钮 Go 时,是调度程序线程执行 GoButton_Click。因此,您永远不应该创建由 UI(调度程序线程)async 调用的方法。

private void GoButton_Click(object sender, RoutedEventArgs e)
{
Hide();

m_files = new CopyFilesWindow();
m_files.Show();

m_dispatcherTimer = new DispatcherTimer();
m_dispatcherTimer.Tick += dispatcherTimer_Tick;
m_dispatcherTimer.Interval = new TimeSpan(0, 0, 0, 0, 250);
m_dispatcherTimer.Start();

SomeLongRunningTask.ContinueWith(() =>
{
// Executes this once SomeLongRunningTask is done (even if it raised an exception)
m_files.Hide();
Show();
}, TaskScheduler.FromCurrentSynchronizationContext()); // This paramater is used to specify to run the lambda expression on the UI thread.
}

关于c# - DispatcherTimer 未在 wpf 应用程序中触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17777355/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com