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

标签 c# .net wpf

我有一些 WPF 应用程序。我需要在 BackgroundWorker 中执行一些代码,为此我使用了 DispatcherTimer。此外,该代码不使用 UI。

我的问题是这样可以吗?还是使用 Timerwhile & Thread.Sleep 更好?

另外,使用 TaskTimerDispatcherTimer 代替 BackgroundWorker 更好吗?

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

  1. BackgroundWorker 调用 DispatcherTimer ||定时器 || (While & Thread.Sleep)

  2. Task 调用 DispatcherTimer ||定时器 || (While & Thread.Sleep)

我只需要知道最佳性能解决方案。

代码如下

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();  
}

最佳答案

如果您的代码不使用 UI,则 DispatcherTimer 是不必要的 - 它专门用于在 Dispatcher 线程(通常是 UI 线程)上触发代码。一个普通的计时器就足够了。

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

关于c# - 我们可以在 BackgroundWorker 中使用 DispatcherTimer 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11865274/

相关文章:

wpf - 添加依赖属性来控制

WPF 错误 : "Items collection must be empty before using ItemsSource."

c# - 如何使用本地身份验证在 asp.net webforms 中使用新字段更新 ApplicationUser?

C# IDataErrorInfo 和子属性

c# - 通过元数据 token 访问 PropertyInfo 以便从 IL 使用?

.net - "Splicing"代码写入 Windows 可执行文件

c# - c# Windows 服务中的数据库查询 - 执行无提示地失败

c# - WinForms 中单选按钮列表的第三方控件?

.net - 如何基于托管代码在桌面和移动应用程序之间交换数据

Wpf ItemsControl.ItemsPanelTemplate 作为 Grid 并在不同列中添加新项目