1

皆さん、こんにちは。

デスクトップ上のいくつかのファイルをスキャンし、それに対していくつかのアクションを実行するスレッドを作成しました。問題は、このスレッドのプロセスが一度だけ発生することです - ファイルのスキャンが完了したときです。

そのスレッドでの私の目的は、停止することなくいつでもディレクトリをスキャンすることです、CPU 使用率のオーバーフローを引き起こすことはありません。このスキャンの停止を回避するスマートな方法を使用したいと考えています。

ファイルでのアクションは、そこにある必要がある特定のコンテンツがあるかどうかを確認することです。すべてのファイルでこのコンテンツをスキャンしています。

while私は無限ループ スタイルを使用しようとしました:

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

しかし、そのループでシステム リソースをポンピングするため、リスクが高すぎます。

よりスマートなコードを作成する方法をいくつか考えました。

  1. 20 秒の遅延でタイマーによってスレッドを実行します。しかし、ファイルの量と、ディレクトリをスキャンするプロセスにかかる時間はわかりません..

  2. おそらくいくつかのスレッドを作成します-最初のスレッドが終了したら、新しいスレッドを作成します。新規作成とメモリ使用量の関係で、このように使用するのは非常にばかげていると思います。

同じ問題に遭遇した何人かの人々が私にアドバイスできますか?

4

3 に答える 3

1

ファイルを定期的にスキャンしたいが、どれくらいの時間がかかるかわからない場合は、次のように while ループの最後にスリープを入れるだけです。

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

もう 1 つのオプションは、タイマーを使用してスキャン機能を定期的に実行し、まだスキャン中かどうかを示すフラグを保持し、次の場合は単純に戻ることです。

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;
    }
}
于 2013-10-02T19:37:35.473 に答える
0

単純な thread.sleep(1) はそれをカットする必要があります。私は一度にいくつかのそのようなループを実行するソフトウェアを持っており、単純な 1 ミリ秒のスリープで CPU 使用率を 1% 未満に戻すのに十分でした。

于 2013-10-02T19:45:56.333 に答える