C# 持续运行后台工作人员

C# 持续运行后台工作人员,c#,multithreading,winforms,backgroundworker,infinite-loop,C#,Multithreading,Winforms,Backgroundworker,Infinite Loop,我需要能够持续运行我的BackgroundWorker。DoWork事件包含一个池线程化进程,OnComplete更新我的UI 我无法找到一种方法来无限循环BackgroundWorker.RunWorkerAsync()方法,而不冻结整个程序。任何帮助都将不胜感激。您必须在您的工作方法中进行循环。要更新UI,应使用ProgressChanged方法。下面是一个小示例,它是如何显示的 public Test() { this.InitializeComponent();

我需要能够持续运行我的
BackgroundWorker
DoWork
事件包含一个池线程化进程,
OnComplete
更新我的UI


我无法找到一种方法来无限循环
BackgroundWorker.RunWorkerAsync()
方法,而不冻结整个程序。任何帮助都将不胜感激。

您必须在您的工作方法中进行循环。要更新UI,应使用ProgressChanged方法。下面是一个小示例,它是如何显示的

 public Test()
    {
        this.InitializeComponent();
        BackgroundWorker backgroundWorker = new BackgroundWorker
            {
                 WorkerReportsProgress = true,
                WorkerSupportsCancellation = true
            };
        backgroundWorker.DoWork += BackgroundWorkerOnDoWork;
        backgroundWorker.ProgressChanged += BackgroundWorkerOnProgressChanged;
    }

    private void BackgroundWorkerOnProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        object userObject = e.UserState;
        int percentage = e.ProgressPercentage;
    }

    private void BackgroundWorkerOnDoWork(object sender, DoWorkEventArgs e)
    {
        BackgroundWorker worker = (BackgroundWorker) sender;
        while (!worker.CancellationPending)
        {
            //Do your stuff here
            worker.ReportProgress(0, "AN OBJECT TO PASS TO THE UI-THREAD");
        }        
    }

如果您的程序冻结,可能是因为您的无限循环后台工作线程正在旋转,使用100%的CPU。您还没有说明为什么需要它在无限循环中运行,但是您可以先在该循环中放置一个
线程。Sleep

我以前在需要在后台运行某些东西时就这样做了。 如果您试图在backgroundworker运行时运行它,您将获得一次开除! 这就是为什么我让BackGroundWorker在完成事件时自动启动

然后它将永远循环

private void Main_Load(object sender, EventArgs e)
{
   // Start Background Worker on load
   bgWorker.RunWorkerAsync();
}

private void bgWorker_DoWork(object sender, DoWorkEventArgs e)
{
   Thread.Sleep(1000);   // If you need to make a pause between runs
   // Do work here
}

private void bgCheck_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// Update UI

// Run again
bgWorker.RunWorkerAsync();   // This will make the BgWorker run again, and never runs before it is completed.
}

您想对您的
后台工作人员做什么?为什么您希望它连续运行?为什么不使用“常规”线程呢?或者是任务之类的。。你到底为什么需要后台工作人员?好吧,它从来就不是要这样使用的。你可以与主线程(UI)通信,并让BackgroundWorker使用ReportsProgress运行。后台工作程序运行一个类,该类运行一个多线程进程,每个线程ping一个服务器。我希望在应用程序运行期间,流程始终处于运行状态,并向UI提供数据。需要时,您只需向BGWorker/ThreadPool添加项即可。这里不应该有一个完整的“持续”运行的场景。使用
((BackgroundWorker)sender)代替
(true)
。取消挂起
,并且您支持取消。不过,需要在这一点上翻转逻辑。CancellationPending最初为false,当用户想要取消它时变为true。所以循环应该检查
!worker.CancellationPending
Thread.Sleep是一种不好的做法,不应该用于生产。问题似乎是其他while循环正在进行,例如while(true)。当一个长时间运行的任务要运行并完成时,应该使用线程。即使任务已完成,也没有理由保持线程运行。你需要让事情像他们说的那样“自然发生”。@Ahmedilyas-我没有建议把任何东西投入生产。我认为运行无限循环的BackgroundWorker是一种值得怀疑的做法,但加入线程。睡眠可能会使OP超越“应用程序冻结”问题,从而能够更多地考虑他的设计。他没有说他为什么想要一个无限循环,所以很难提出更合适的替代方案。请注意,“无限循环”并不意味着在多线程应用程序中100%的CPU使用率——通常,它们会阻塞某些东西。而且,这种使用Thread.Sleep的做法确实是不好的,但它有着合法的用途。@MartinJames-似乎对此投了反对票。当然,我同意你的观点,无限循环并不意味着100%的CPU,但是如果有人说如果没有整个程序冻结,他们就不能让无限循环工作,那么插入睡眠可能会帮助他们理解为什么。希望,一旦他们理解了原因,他们将能够设计出一个不需要睡眠的更好的解决方案。与其在每次结束后都重新开始,为什么不做一个while(true)循环,让它无限地运行呢?工作完美无瑕!它的实现比计时器更简单,并且在不锁定UI的情况下完成它的工作!非常感谢,很棒的方法:)!应标记为答案。-bkribs,因为这样,如果需要更新UI元素,您还可以在“ProgressUpdate”和“WorkerCompleted”中添加代码:)最好包含某种形式的详细信息或说明,说明您的答案为什么有效,而不仅仅是代码。虽然此代码片段可以解决问题,确实有助于提高你的文章质量。请记住,您将在将来回答读者的问题,这些人可能不知道您的代码建议的原因。还请尽量不要用解释性注释挤满您的代码,因为这会降低代码和解释的可读性!
 timer.interval=60000 // 1 min

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        timer1.Start();

    }
 private void timer1_Tick(object sender, EventArgs e)
    {
        try
        {
           //Do something
        }
        catch
        {


        }
    }