【问题标题】:Thread to process infinite work处理无限工作的线程
【发布时间】:2013-10-02 19:31:52
【问题描述】:

大家好,

我创建了一个线程来扫描桌面上的一些文件并使用它执行一些操作。问题是这个线程的进程只发生一次 - 当文件扫描完成时。

我使用该线程的目的是在不停止的情况下随时扫描目录,而不会造成 CPU 使用溢出。我想使用一种聪明的方法来防止停止此扫描。

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

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

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

但这太冒险了,因为该循环会抽取系统资源。

我想到了一些如何创建更智能的代码:

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

  2. 可能创建线程数 - 在第一个线程完成后,创建一个新线程。 我觉得用这种方式很可笑,因为新的创建和内存占用。

有遇到同样问题的朋友可以指教一下吗?

【问题讨论】:

标签: c# .net multithreading


【解决方案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 的想法
【解决方案2】:

一个简单的 thread.sleep(1) 应该可以解决这个问题,我有一个软件可以同时运行几个这样的循环,一个简单的 1 毫秒睡眠就足以让 CPU 使用率回到 1% 以下。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-30
      • 1970-01-01
      • 1970-01-01
      • 2018-09-09
      • 2019-09-27
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多