持续运行BackgroundWorker

use*_*817 15 c# multithreading backgroundworker infinite-loop winforms

我需要能够继续运行我的BackgroundWorker.该DoWork事件包含池线程进程并OnComplete更新我的UI.

BackgroundWorker.RunWorkerAsync()没有整个程序冻结的情况下,我无法找到无限循环方法的方法.任何帮助将不胜感激.

Tom*_*tom 26

你必须在你的DoWork-Method中循环.要更新UI,请使用ProgressChanged-Method.这是一个小例子,它是如何看起来的

 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");
        }        
    }
Run Code Online (Sandbox Code Playgroud)

  • 而不是`while(true)`使用`((BackgroundWorker)发送者).CancellationPending`并且你支持取消. (5认同)

小智 7

我在过去需要在后台运行时才这样做.如果您尝试在运行时运行后台工作程序,您将获得一个急救!这就是为什么我让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.
}
Run Code Online (Sandbox Code Playgroud)

  • 工作完美!它的实现比计时器更容易,并且无需锁定UI即可完成工作!非常感谢,很棒的方法:)!应该标记为答案. (2认同)