Мне нужно сделать некоторые фоновые работы каждые 20 секунд (это не должно быть ровно 20000 мс, я могу позволить задержки). Я использую BackgroundWorker, который выполняет функцию, а затем ждать еще 20 секунд с помощью таймера:Использование фонового рабочего стола и процессора
private readonly BackgroundWorker Worker = new BackgroundWorker();
volatile bool keepWorkerRunning;
Worker.DoWork += Worker_DoWork;
private void Worker_DoWork(object sender, DoWorkEventArgs e)
{
System.Timers.Timer aTimer = new System.Timers.Timer();
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.Interval = 20000;
aTimer.Enabled = true;
keepWorkerRunning = true;
while (keepWorkerRunning) ;
aTimer.Enabled = false;
}
Этот работник действует в течение всего времени, в то время как программное обеспечение работает.
Проблема в том, что требуется большая часть процессора. Я заметил, что мое программное обеспечение все время использует около 70% процессора, и просто отключая фоновой рабочий, загрузка процессора падает до 0,5%.
Как я могу выполнить ту же работу без перегрузки процессора?
Почему вы используете таймер и BackgroundWorker одновременно? Вы можете просто сделать то, что хотите сделать в обработчике «Tick» одного таймера, который тикает каждые 20 секунд. Кроме того, причиной использования ЦП, вероятно, не является конструкция BackgroundWorker/Timer, но ваш цикл занятости ('while (true)') – LInsoDeTeh
Я помню, как копировал эту структуру из предыдущего сообщения или ответа. Он выполняет именно то, что мне нужно, но требует слишком большой мощности процессора. У вас есть альтернативное решение, которое займет меньше? Обратите внимание, что это должно быть сделано в другом потоке, чем в пользовательском интерфейсе. – Hamma
Если вы действительно хотите пойти с этим решением, замените 'while (keepWorkerRunning);' с чем-то вроде 'while (keepWorkerRunning) {Threading.Thread.Sleep (100); } ', чтобы избавиться от цикла занятости, в котором вы занимаете полную мощность процессора. – LInsoDeTeh