2013-10-02 7 views
1

Привет, ребята,резьбы для обработки бесконечных РАБОТУ

Я создал нить, что сканирование для некоторых файлов на рабочем столе и делать какие-то действия с этим. Проблема в том, что процесс этого потока происходит только один раз - при проверке файлов.

Моей целью этой темы является сканирование каталогов в любое время без остановки , но без создания переполнения процессора. Я хочу использовать умный способ предотвратить остановку этого сканирования.

Действие с файлами должно проверить, есть ли определенный контент, который должен быть там, я просматриваю этот контент во всех файлах.

Я пытался использовать стиль в while бесконечного цикла:

public void bwScanning() 
{ 
    while(true) 
    { 
     // the whole code of scanning goes here. 
    } 
} 

Но это слишком рискованно из-за системы откачки ресурсов с этим циклом.

Я думал о нескольких вещах, как создать умный код:

  1. Run нить таймер с задержкой в ​​20 секунд. Но тогда я не знаю, каково количество файлов и сколько времени требуется для процесса сканирования dirs.

  2. Возможно, создайте количество потоков - после завершения первого потока создайте новый один. Я думаю, что это очень смешно, чтобы использовать этот путь из-за нового творчества и использования памяти.

Некоторые люди, столкнувшиеся с одной и той же проблемой, могут мне посоветовать?

+11

Я не знаю, что вам нужно сделать с файлами, которые вы найдете, но это звучит, как вы, возможно, захотите посмотреть на [ ' FileSystemWatcher'] (http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx) –

+1

@DaveZych ok, я прочитаю об этом. –

+1

Вы заглянули в 'Thread.Sleep()' для приостановки потока. Я не уверен, что вы подразумеваете под _pumping системных ресурсов с помощью этого цикла? – hylander0

ответ

1

Если вы хотите периодически сканировать файлы, но вы не знаете, как долго он принимает что-то реальное простой, чтобы положить спать в конце вашего цикла в то время как это:

public void bwScanning() 
{ 
    while(true) 
    { 
     // the whole code of scanning goes here. 
     Thread.Sleep(20000); // sleep 20sec 
    } 
} 

Другой вариант заключается в использовать таймер для запуска функции сканирования в определенные промежутки времени, и держать флаг, указывающий, являются ли вы еще в процессе сканирования и просто вернуть, если вы:

bool isProcessing; 
public void bwScanning() 
{ 
    if (isProcessing) return; 
    isProcessing = true; 
    try { 
     // the whole code of scanning goes here. 
    } 
    finally { 
     // in case your processing code throws an exception this ensures you are resetting the flag 
     isProcessing = false; 
    } 
} 
+0

Мне нравится идея булевого флага +1 –

0

простой Thread.Sleep (1) следует сократить его , У меня есть программное обеспечение с несколькими такими циклами, которые запускаются сразу d простой спальный 1 мс был достаточным для того, чтобы вернуть использование процессора в 1%.

0

Как вы можете остановить поток? Предполагается использовать объект события, чтобы сигнализировать завершение, я хотел бы предложить что-то вроде:

public void bwScanning() 
{ 
    while(! stopEvent.WaitOne(20*1000,false)) 
    { 
     // the whole code of scanning goes here. 
    } 
} 
Смежные вопросы