如何解决dispachertimer在c#中挂起应用程序?

时间:2015-02-18 09:26:44

标签: c# wpf multithreading asynchronous dispatchertimer

使用下面的代码自动调用报告。但是30秒后应用程序挂起(即UI冻结)几秒钟。

如何在不挂问题的情况下解决这个问题。 下面是我的代码

     System.Windows.Threading.DispatcherTimer dispatcherTimer2 = new  
                                        System.Windows.Threading.DispatcherTimer();

  dispatcherTimer2.Tick += new EventHandler(dispatcherTimer2_Tick);
     dispatcherTimer2.Interval = new TimeSpan(0, 0, 30);
     dispatcherTimer2.Start();

    private void dispatcherTimer2_Tick(object sender, EventArgs e)
   {
     automaticreportfunction();

   }

30秒后它会挂起应用程序,如何解决这个问题

1 个答案:

答案 0 :(得分:0)

DispatcherTimer在背景线中运行。 Tick-Event中的所有方法都在UI-Tread中运行。这就是你的应用程序将冷冻的原因。您必须将automaticreportfunction()移动到后台线程才能使UI保持活动状态。

因此,你有几个机会。我个人更喜欢使用BackgroundWorker(我知道还有其他方法,但我最喜欢这个)。因此,在您的Tick - 活动中,您可以执行以下操作:

private void dispatcherTimer2_Tick(object sender, EventArgs e)
{
    DispatcherTimer dispatcherTimer = (DispatcherTimer)sender;
    dispatcherTimer.Stop();
    BackgroundWorker backgroundWorker = new BackgroundWorker();
    backgroundWorker.DoWork += (bs, be) => automaticreportfunction();
    backgroundWorker.RunWorkerCompleted += (bs, be) => dispatcherTimer.Start();
    backgroundWorker.RunWorkerAsync();
}

当你输入tick-method并在automaticreportfunction完成后再次重启时,我也会停止计时器,否则你可以在执行仍然运行时再次输入方法。