1

これで、filesystemWatcher を使用してイベントをトリガーするアプリケーションを作成できました。FSW は、非常に近い回数でトリガーします。FSW が最後にトリガーされてから 1 時間後にトリガーする関数を作成したいと考えています。

私は最初にバックグラウンドワーカーを使用してみました: (すべてのコードはわかりやすくするために短縮されています)

namespace Devo
{
    public partial class Form1 : Form
    {
        BackgroundWorker bw = new BackgroundWorker();

        private void fileSystemWatcher_Created(object sender, FileSystemEventArgs e)
        {

            if (bw.IsBusy)
            {
                bw.CancelAsync(); //this is to, in a way, reset the timer for the delayed method.
            }

            //do a lot of stuff

            bw.RunWorkerAsync();
        }

        private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            Stopwatch sw = new Stopwatch();
            sw.Start();

            while(sw.ElapsedMilliseconds < 180000)
            {
                if (bw.CancellationPending == true)
                {
                    sw.Stop();
                    sw.Reset();
                    e.Cancel = true;
                    return;
                }
            }

            sw.Stop();
            sw.Reset();

            DelayedMethod();
        }
    }
}

への呼び出しにもかかわらず、2 回目bw.RunWorkerAsync()の呼び出しが明らかにビジーであったため、これは機能しませんでしたbw.CancelAsync()

私の次の試みには、SO のどこかで読んだ通常のスレッドが含まれていました (今はリンクが見つかりません)。

スレッドの試行はほぼ同じですが、通常のスレッドには存在しない backgroundWorker 内にいくつかの制約がある可能性があるため、試してみると思いました。と思いました。

namespace Devo
{
    public partial class Form1 : Form
    {
        Thread PWC_counter_thread = new Thread(PWC_Counter);

        private void fileSystemWatcher_Created(object sender, FileSystemEventArgs e)
        {

            if (PWC_counter_thread.IsAlive)
                PWC_counter_thread.Abort();

            //do a lot of stuff

            PWC_counter_thread.Start();
        }

        static void PWC_Counter()
        {
            Thread.Sleep(180000);

            DelayedMethod();
        }
    }
}

しかし、これは私に同じエラーを与えました。への 2 番目のコールPWC_counter_thread.Start()はビジーでした。

2 番目のスレッドがこの例では 3 分間待機し、最初の FSW メソッドの実行に 1 秒ほどかかるため、競合状態は存在しないと想定しています。したがって、.Abort() の呼び出しと.CancelAsync() 両方とも、それぞれのメソッドが完了する前に実行されます。

質問は次のとおりです。

私が試みている方法でスレッドを再起動することは可能ですか? もしそうなら、私は何を間違っていますか?

別の方法でメソッド呼び出しを遅らせる必要がありますか? もしそうなら、ヒントは?

編集/更新/解決策

スレッドを開始および停止して思い通りに動作させることができなかったので、状況に対する別の解決策を見つけました。

状況は、一定時間後にメソッドを呼び出す一種のタイマーとして機能する 2 番目のスレッドを持っていたということでした。私の最初のスレッドはいくつかの作業を行い、終了すると2番目のスレッドが開始されました。タイマースレッドが終了する前に最初のスレッドが再び起動された場合、スレッドを強制終了して再起動することになっていました。これは、私が望んでいた方法を実現するのが難しいことを証明しました。そのため、代わりに、希望する最終結果に向けて別のアプローチを取りました。スレッドを再起動する代わりに、2 番目のスレッドがカウンターとして使用していたストップウォッチを再起動しました。これにより、私が望んでいた結果が得られました。おそらく悪い習慣ですが、うまくいきます。

4

2 に答える 2