3

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

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

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

请告诉我最好的方法来做到这一点。

4

2 回答 2

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
}
于 2012-04-17T16:44:35.643 回答
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();
        }

    }
于 2012-04-24T08:58:01.187 回答