线程处理无限工作
本文关键字:工作 无限 处理 线程 | 更新日期: 2023-09-27 18:33:34
大家好,
我创建了一个线程,用于扫描桌面上的某些文件并对其进行一些操作。问题是此线程的过程仅发生一次 - 当文件扫描完成时。
我使用该线程的目的是随时扫描目录,而不会停止,但不会造成 CPU 使用率溢出。我想使用一种智能方法来防止停止此扫描。
文件的操作是检查是否有需要的特定内容,我正在扫描所有文件中的此内容。
我尝试使用while
无限循环样式:
public void bwScanning()
{
while(true)
{
// the whole code of scanning goes here.
}
}
但这风险太大,因为该循环会消耗系统资源。
我想到了如何创建更智能的代码的一些事情:
通过计时器运行线程,延迟为 20 秒。但是,我不知道文件的数量是多少,扫描目录的过程需要多少时间。
也许创建多个线程 - 第一个线程完成后,创建一个新线程。我认为使用这种方式是非常荒谬的,因为新的创建和内存使用。
一些遇到同样问题的人可以建议我吗?
如果您想定期扫描文件,但不知道需要多长时间,那么在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;
}
}
一个简单的 thread.sleep(1( 应该可以解决这个问题,我有一个同时运行多个此类循环的软件,一个简单的 1 毫秒睡眠足以将 CPU 使用率恢复到 1% 以下。
你怎么停止线程?假设您使用事件对象来发出关闭信号,我建议如下:
public void bwScanning()
{
while( ! stopEvent.WaitOne(20*1000,false))
{
// the whole code of scanning goes here.
}
}