2012-09-28 4 views
1

Я очень новичок в потоковом режиме в .NET и ограниченное использование потоков в Java. Короче говоря, у меня есть форма, которая имеет объект System.Windows.Forms.Timer. Таймер тикает каждые 1000 мс. Обработчик событий просто проверяет переменную класса bool (то есть обрабатываетResponseFiles), чтобы определить, выполняется ли текущая операция обработки файлов запроса. Если не выполняется, он должен обрабатывать любые файлы запросов. В противном случае он ничего не должен делать.Timer Object and BackgroundWorker

Метод ProcessRequestFiles рассматривает запрос, а затем выполняет BackgroundWorker для выполнения работы. Проблема, с которой я борюсь, заключается в том, что значение обработкиResponseFiles всегда ложно, хотя я назначаю его true в первом выражении метода ProcessingRequestFiles. Может кто-то, пожалуйста, скажите мне, почему значение обработкиResponseFiles всегда ложно, хотя я устанавливаю его в методе ProcessRequestFile()?

Мне нужно защитить этот метод, чтобы он не выполнялся более одного раза.

private void timerRequestTimer_Tick(object sender, EventArgs e) 
{ 
    if (!processingResponseFiles) 
    { 
     ProcessRequestFile();     
    } 

private void ProcessRequestFile() 
{ 
    processingResponseFiles = true; 

    // Process Request Files 
    // If request type is Synchronize Customers 
    // Run thread that synchronizes customers 
    // If request type is Synchronize Items 
    // Run thread that synchronizes items 

    processingResponseFiles = false; 
} 
+0

Вы задумывались над тем, чтобы смотреть на Singleton или Mutex ..? – MethodMan

ответ

2

Это не очень понятно, слишком много вещей закомментировано, но очевидно, что флаг должен быть сброшен обратно false в обработчик событий BackgroundWorker.RunWorkerCompleted. Только тогда вы знаете, что работа была завершена. Или просто используйте свойство BackgroundWorker.IsBusy.

+0

Я определенно считаю, что мне нужно изменить подход к дизайну, но можете ли вы придумать какую-либо причину, почему переменная класса processingResponseFiles всегда верна? В настоящее время я не трогаю его ни в одном из потоков, и каждый раз, когда Таймер запускается, значение всегда является значением по умолчанию false, даже если я устанавливаю его в true в методе ProcessRequestFile() в форме. В любом случае, я буду читать больше о потоках, но я хотел бы понять, что это значит, чтобы переменная класса bool всегда была равна = false. – Grasshopper

+0

Вы возвращаете значение false в конце метода. Это означает, что обработчик событий таймера Tick всегда будет ** видеть, что он установлен в false. Как я объяснил, установите вместо этого значение false в обработчике событий RunWorkerCompleted. –

+0

Hans Approach действительно хорош, но я не уверен, что OP понимает, что он пытается сделать сам. – MethodMan