Постоянная работа 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
в этом цикле.