修改线程中使用的数据

时间:2012-07-27 16:12:17

标签: c# multithreading .net-4.0

好的,我的问题是我必须抓住删除并重命名事件(我可以做)。并修改线程中的数据以处理此问题,以便删除已删除的文件,并重命名的文件更改其数据。这是系统的伪代码,只是为了了解它的外观。每当我删除时,系统都会抛出一个异常,但它没有被捕获,所以我很难弄清楚如何解决或重写解决方案。另一部分是我将同时运行多个经理,但我想如果我不能让一个人工作......那么这是徒劳的。

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));
    }
}

1 个答案:

答案 0 :(得分:0)

您应该使用线程同步来保护多个线程之间共享的数据不被破坏。请参阅lock关键字或Mutex类。

但是,我真的建议不要重写任务排队/调度并使用现成的东西。

简单地在OnDelete处理程序中进行处理有什么问题?