线程处理无限的工作

时间:2013-10-02 19:31:53

标签: c# .net multithreading

大家好,

我创建了一个扫描桌面上某些文件的线程,然后用它做一些操作。问题是这个线程只发生一次 - 当扫描文件完成时。

我对该线程的目的是随时扫描目录而不停止而不会造成CPU使用率的溢出。我想用一种聪明的方法来阻止这种扫描。

文件的操作是检查是否存在需要的特定内容,我正在所有文件中扫描此内容。

我尝试使用while无限循环样式:

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

但由于该循环泵送系统资源,风险太大。

我考虑过如何创建更智能的代码:

  1. 按计时器运行一个延迟20秒的线程。但是,我不知道文件的数量是多少以及扫描dirs的过程需要多长时间..

  2. 可能创建线程数 - 在第一个线程完成后,创建一个新线程。 我认为使用这种方式非常荒谬,因为新的创建和内存使用。

  3. 遇到同样问题的一些人可以建议我吗?

3 个答案:

答案 0 :(得分:1)

如果你想定期扫描这些文件,但是你不知道需要多长时间,那么简单的就是在你的while循环结束时进行睡眠,如下所示:

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;
    }
}

答案 1 :(得分:0)

一个简单的thread.sleep(1)应该剪掉它,我有一个软件,一次运行几个这样的循环,一个简单的1毫秒睡眠就足以将cpu使用率发回到1%以下。

答案 2 :(得分:0)

你如何停止线程?假设您使用事件对象来发出关闭信号,我建议如下:

public void bwScanning()
{
   while( ! stopEvent.WaitOne(20*1000,false))
   {
       // the whole code of scanning goes here.
   }
}