【问题标题】:WPF, why my BackgroundWorker function only runs one time? [closed]WPF,为什么我的 BackgroundWorker 函数只运行一次? [关闭]
【发布时间】:2013-02-06 03:43:34
【问题描述】:

我有一个功能,我想每 1 秒运行一次,除此之外我还有其他东西, 因为我在我的其他函数上使用了 Thread 并避免了窗口崩溃,所以我决定使用 Backgroundworker 来调用假设像这样运行的函数:

Main()
{
    BackgroundWorker worker = new BackgroundWorker();
    worker.DoWork += new DoWorkEventHandler(worker_DoWork);
    worker.RunWorkerAsync();
}

public void worker_DoWork(object sender, EventArgs e)
{
    AutoChecking(); // thats a function should Run on Background every 1 second
}

public void AutoChecking()
{
    this.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() =>
    {
        if (SystemisGood == true)
            Updatecolor.Fill = Green;
        else
            Updatecolor.Fill = Red;
    }));
}

然而,这个功能现在只能工作一次,任何理由或解决方案让它每秒钟工作一次并留在后台工作人员?! P.S:我不想用定时器...

【问题讨论】:

  • 你为什么不想使用计时器?这就是他们的目的。
  • 我宁愿只使用它,因为 Timer 会阻塞我的主函数线程...
  • 你能发布代码如何使用 Timer 来阻止你的 UI 吗?使用 backgroundworker 作为计时器并不是很好的方法
  • System.Timers.Timer CheckTimer = new System.Timers.Timer(1000); CheckTimer.Elapsed += new ElapsedEventHandler(CheckTimer_Elapsed); CheckTimer.Start();
  • @CuongLe 检查评论那是我如何使用我的计时器

标签: c# wpf function backgroundworker


【解决方案1】:

不使用计时器是很浪费的,因为它们非常轻量级并且只是发送定期消息,但是您可以通过使用低开销轮询循环并检查时间来完成您想要的事情,就像由计时器代码本身。例如:

Main()
{
    BackgroundWorker worker = new BackgroundWorker();
    worker.DoWork += new DoWorkEventHandler(worker_DoWork);
    worker.RunWorkerAsync();
}

bool exitBGThread = false;

public void worker_DoWork(object sender, EventArgs e)
{
    TimeSpan interval = new TimeSpan(0, 0, 1);
    while (!exitBGThread)
    {
        DateTime start = DateTime.Now;
        AutoChecking();  // thats a function should Run on Background every 1 second

        while (!exitBGThread)
        {
            DateTime cur = DateTime.Now;
            if (cur - start >= interval)
                break;
            Thread.Sleep(100);
        }
    }
}

public void AutoChecking()
{
    this.Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() =>
    {
        if (SystemisGood  == true )
             Updatecolor.Fill = Green;
        else 
             Updatecolor.Fill = Red;
    }));
}

这有点简化,因为如果您实际使用了 exitBGThread,您可能希望使用 lock { },但您明白了。

【讨论】:

  • 它的代码做得很好,但当我试图在屏幕上移动窗口时,它仍然冻结我的窗口
  • 这段代码不可能冻结你的窗口。它在后台线程中运行,并且延迟非常低——它每秒进行大约 10 次简单的时间检查。
  • 也许他在他的 SystemIsGood 属性中做了一些冗长的同步操作来检查系统是否良好 :)....是的淘气......在这种情况下,它需要移动到 BackgroundWorker 线程中
  • @colinsmith,这是一个很好的猜测。也可能是一段不相关的代码是 UI 线程阻塞。无论如何,每秒消耗少于 1 毫秒的不是低延迟后台线程。我回答了他的实际问题,但他希望在不发布代码的情况下调试他的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-20
  • 2020-07-31
  • 1970-01-01
  • 2012-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多