我们可以在BackgroundWorker中使用DispatcherTimer吗?

时间:2012-08-08 13:11:04

标签: c# .net wpf

我有一些WPF应用程序。我需要在BackgroundWorker内执行一些代码,然后使用DispatcherTimer。此代码也不使用UI。

我的问题是这样吗?或者最好使用Timerwhile& Thread.Sleep

使用Task& TimerDispatcherTimer代替BackgroundWorker

所以我们有2种方法可供选择。 (或更多?)

  1. BackgroundWorker来电DispatcherTimer || Timer || (While & Thread.Sleep)

  2. Task来电DispatcherTimer || Timer || (While & Thread.Sleep)

  3. 我只需要了解最佳性能解决方案。

    这是一些代码

    DispatcherTimer logManagerUpdater = new DispatcherTimer(DispatcherPriority.Background);
    BackgroundWorker logManagerWorker = new BackgroundWorker();
    
    private void StartLogManager()
    {
        logManagerWorker.DoWork += new DoWorkEventHandler(logManagerWorker_DoWork);
        logManagerWorker.RunWorkerAsync();
    }
    
    void logManagerWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        if (this.logManagerWorker.CancellationPending)
        {
           e.Cancel = true;
           return;
        }
    
        logManagerUpdater.Interval = new TimeSpan(0, 0, 10);
        logManagerUpdater.Tick += new EventHandler(logManagerUpdater_Tick);  
        logManagerUpdater.Start();
    }
    
    void logManagerUpdater_Tick(object sender, EventArgs e)
    {
       LogManagerJob();   
       LogDBManagerJob();  
    }
    

1 个答案:

答案 0 :(得分:4)

如果您的代码不使用UI,则DispatcherTimer是不必要的 - 特别是在Dispatcher线程(通常是UI线程)上激活代码。一个普通的计时器就足够了。

此外,在您发布的代码中,您实际上是“创建后台线程来创建后台线程”。我建议您完全删除后台工作程序,只需在StartLogManager方法中创建计时器。