Постоянная работа BackgroundWorker

Мне нужно иметь возможность постоянно запускать мой BackgroundWorker. Событие DoWork содержит процесс с пулом, а OnComplete обновляет мой интерфейс.

Мне не удалось найти способ бесконечно циклировать метод BackgroundWorker.RunWorkerAsync() без зависания всей программы. Любая помощь будет принята с благодарностью.

Ответ 1

Вам нужно сделать цикл в вашем DoWork-Method. Чтобы обновить пользовательский интерфейс, вы используете метод 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");
        }        
    }

Ответ 2

Я сделал это в прошлом, когда мне нужно что-то запустить в фоновом режиме. Если вы попытаетесь запустить фонового рабочего во время его работы, вы получите excpetion! Вот почему я запускаю 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.
}

Ответ 3

 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
        {


        }
    }

Ответ 4

Если ваша программа зависает, это может быть связано с тем, что ваш бесконечный цикл рабочего рабочего потока вращается, используя 100% процессор. Вы не сказали, зачем вам нужно работать в бесконечном цикле, но вы можете начать с размещения Thread.Sleep в этом цикле.