C#后台工作人员冻结了GUI

C#后台工作人员冻结了GUI,c#,background,worker,C#,Background,Worker,我试图使用后台工作程序不断更新文本标签,但是对于DoWork,如果没有使用循环,它将只执行一次,但是如果使用无限循环,它会冻结GUI,有没有解决这个问题的方法?真的很感激!!!我对C#还很陌生,还在努力学习 这是我的密码: 这主要表现在: backgroundWorkerX.DoWork += backgroundWorkerX_DoWork; backgroundWorkerX.ProgressChanged += backgroundWorkerX_ProgressChanged; back

我试图使用后台工作程序不断更新文本标签,但是对于DoWork,如果没有使用循环,它将只执行一次,但是如果使用无限循环,它会冻结GUI,有没有解决这个问题的方法?真的很感激!!!我对C#还很陌生,还在努力学习

这是我的密码:

这主要表现在:

backgroundWorkerX.DoWork += backgroundWorkerX_DoWork;
backgroundWorkerX.ProgressChanged += backgroundWorkerX_ProgressChanged;
backgroundWorkerX.WorkerReportsProgress = true;
backgroundWorkerX.RunWorkerAsync();
然后:

[…]如果没有使用循环,它将只执行一次

这是预期的行为。它将完成预期的任务,然后调用

[…]但是如果使用无限循环,它会冻结GUI

// I assume that you loop like this somehow.
do 
{
    X = -(RSSI_PI1_ST1);
    backgroundWorkerX.ReportProgress(X);
} while (true);
你的问题中没有循环。因此,我将做出一个假设,并给您一个有根据的猜测,它实际上消耗了所有的CPU,因此会使GUI崩溃

// I assume that you loop like this somehow.
do 
{
    X = -(RSSI_PI1_ST1);
    backgroundWorkerX.ReportProgress(X);
} while (true);
偶尔尝试添加一些东西来“放慢速度”。否则,它将以尽可能快的速度运行,从而消耗所有可用的CPU。请记住,每次使用
ReportProgress
时,它都将由GUI线程呈现。这将非常频繁地执行,不会为GUI线程留下很多资源来响应其他事情。下面我使用,这将暂停线程半秒。但请记住,您只希望在后台线程中执行此操作

do 
{
    X = -(RSSI_PI1_ST1);
    backgroundWorkerX.ReportProgress(X);
    Thread.Sleep(500);
} while (true);
我也会考虑用另一种方式做这件事。如果您确实需要暂停线程,那么您最好使用一个<代码>线程。睡眠将锁定线程,因此可能不是您真正想要的。发件人:


“但是如果使用无限循环,它会冻结GUI”-什么循环?不管怎样,如果你的循环非常紧密,包括一个
ReportProgress
,那么这将自然降低所有编组的速度感谢快速响应,我将循环放在“public void backgroundWorkerX\u DoWork”下”然后,如果数据发生变化,它会冻结窗口,我查了一下,有人说你不能在DoWork中放入无限循环,因为程序将继续在这个循环中循环,但我不知道如何解决它…谢谢!!!我认为这是一个无限消耗CPU的问题,增加一个延迟就可以解决它!非常感谢您的支持@当然,增加一个延迟比使用一个线程的效果会适得其反
Process() // method to be called after regular interval in Timer
{
    // lengthy process, i.e. data fetching and processing etc.

    // here comes the UI update part
    Dispatcher.Invoke((Action)delegate() { /* update UI */ });
}