BackGround线程与应用程序级别的WPF应用程序的计时器

时间:2012-04-17 14:37:23

标签: c# wpf multithreading timer scheduler

我有一个wpf应用程序(没有MVVM),这个应用程序需要几个后台线程(具有特定时间间隔的运行)。

这些线程应该在应用程序级别,即如果用户在任何WPF窗口上,这些线程应该是活动的。

基本上这些线程将使用外部资源,因此也需要锁定。

请告诉我最好的方法。

2 个答案:

答案 0 :(得分:8)

如果要在WPF应用程序中定期执行操作,可以使用DispatcherTimer类。

将您的代码作为Tick事件的处理程序,并将Interval属性设置为您需要的任何内容。类似的东西:

DispatcherTimer dt = new DispatcherTimer();
dt.Tick += new EventHandler(timer_Tick);
dt.Interval = new TimeSpan(1, 0, 0); // execute every hour
dt.Start();

// Tick handler    
private void timer_Tick(object sender, EventArgs e)
{
    // code to execute periodically
}

答案 1 :(得分:1)

 private void InitializeDatabaseConnectionCheckTimer()
    {
        DispatcherTimer _timerNet = new DispatcherTimer();
        _timerNet.Tick += new EventHandler(DatabaseConectionCheckTimer_Tick);
        _timerNet.Interval = new TimeSpan(_batchScheduleInterval);
        _timerNet.Start();
    }
    private void InitializeApplicationSyncTimer()
    {
        DispatcherTimer _timer = new DispatcherTimer();
        _timer.Tick += new EventHandler(AppSyncTimer_Tick);
        _timer.Interval = new TimeSpan(_batchScheduleInterval);
        _timer.Start();
    }

    private void IntializeImageSyncTimer()
    {
        DispatcherTimer _imageTimer = new DispatcherTimer();
        _imageTimer.Tick += delegate
        {
            lock (this)
            {
                ImagesSync.SyncImages();
            }
        };
        _imageTimer.Interval = new TimeSpan(_batchScheduleInterval);
        _imageTimer.Start();
    }

这三个主题在App OnStart上初始化

protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        try
        {
            _batchScheduleInterval = Convert.ToInt32(ApplicationConfigurationManager.Properties["BatchScheduleInterval"]);
        }
        catch(InvalidCastException err)
        {
            TextLogger.Log(err.Message);
        }

        Helper.SaveKioskApplicationStatusLog(Constant.APP_START);
        if (SessionManager.Instance.DriverId == null && _batchScheduleInterval!=0)
        {
            InitializeApplicationSyncTimer();
            InitializeDatabaseConnectionCheckTimer();
            IntializeImageSyncTimer();
        }

    }