0

さて、私の問題は、削除イベントと名前変更イベントをキャッチする必要があるということです。そして、これを処理するようにスレッド内のデータを変更して、削除されたファイルが削除され、名前が変更されたファイルのデータが変更されるようにします。これは、システムの疑似コードであり、システムがどのように見えるかを理解するためのものです。削除するたびに、システムは例外をスローしますが、キャッチされないため、解決策を解決したり、解決策を書き直したりする方法を見つけるのに苦労していました。これの他の部分は、一度に複数のマネージャーを実行することですが、1つを機能させることができない場合は、これは無駄です。

Main
{
    public void Run()
    {
        List<FileInfo> someData = new List<FileInfo>();
        FileWatcher fileWatcher = new FileWatcher(@"C:\USers\user1\Documents");

        fileWatcher.NotifyFilter = NotifyFilter.Last
        fileWatcher.Deleted += new FileSystemEventHandler(OnDelete);
        fileWatcher.EnableRaisingEvents = true;

        Manager aManager = new Manager(someData);
        Thread aThread = new Thread(new ThreadStart(aManager.ExecuteTask));
        aThread.Start();
    }

    static void OnDelete(object sender, Event e)
    {
        aManager.Pause();
        aManager.RemoveData(e.FileInfo);
        aManager.Resume();
    }
}


Manager
{
    ExecuteTask()
    {
        while(someData.Count > 0)
        {
            while (paused) ; // <- This is something I am trying to add
            PreformSubTask(someData[0]);
        }
    }

    PreformSubTask()
    {
        lock (_locker)
        {
            Worker someWorker = new Worker(someData[0]);
            Thread someThread = new Thread(new ThreadStart(worker.ExecuteTask()));
        }

        worker.Join(someSetOfTime);

        lock(_locker)
        {
            someData.RemoveAt(0);
        }
    }

    Pause()
    {
        lock (_locker)
        {
            if (!paused) paused = true;
        }
    }

    Resume
    {
        lock (_locker)
        {
            if (paused) paused = false;
        }
    }

    RemoveData(FileInfo toRemove)
    {
        someData.RemoveAll(sd => sd.Equals(someData));
    }
}
4

1 に答える 1

0

複数のスレッド間で共有されるデータが破損しないようにするには、スレッド同期を使用する必要があります。lockキーワードまたはMutexクラスを参照してください。

ただし、タスクのキューイング/スケジューリングを書き直さず、既成のものを使用することを強くお勧めします。

OnDeleteハンドラーで処理を行うだけの何が問題になっていますか?

于 2012-07-27T16:15:33.193 に答える