c#-3.0 - 线程概念

标签 c#-3.0 multithreading

有人可以帮我解决这个问题吗:

private Thread workerThread;
private EventWaitHandle waitHandle;


            if (workerThread == null)
            {
                workerThread = new Thread(new ThreadStart(Work));
                workerThread.Start();
                //workerThread.Join(); 
            }
            else if (workerThread.ThreadState == ThreadState.WaitSleepJoin)
            {
                waitHandle.Set();
            }

    private void Work()
    {
        while (true)
        {
            string filepath = RetrieveFile();
            if (filepath != null)
                ProcessFile(filepath);
            else
                // If no files left to process then wait
                waitHandle.WaitOne();
        }
    }

    private void ProcessFile(string filepath)
    {
        XMLCreation myXML = new XMLCreation();
        myXML.WriteXml(filepath, XMLFullFilePath);
    }

    private string RetrieveFile()
    {
        if (workQueue.Count > 0)
            return workQueue.Dequeue();
        else
            return null;
    }

看看这就是这一切的工作原理。

我有一个文件观察器事件,仅当新文件添加到该文件夹​​时才会触发,现在的问题是它是较大应用程序的一小部分,当文件观察器触发时,有另一个进程正在访问该文件,我得到类似此文件正在被另一个进程使用的错误。所以我尝试通过线程来实现,但使用上面的代码只处理一些文件,但在日志中我可以看到所有文件都在处理。这是正确的方法还是我遗漏了一些东西

感谢副词。

最佳答案

您必须使用互斥体来控制谁正在访问该文件,并且一次只允许一个进程在第一次使用该文件。如果您认为可能有多个线程正在等待处理同一个文件,那么您将必须使用队列实现一个生产者-消费者线程系统>.

以下是您可以在 .NET 中找到的有关线程的最佳文档:

http://www.albahari.com/threading/

关于c#-3.0 - 线程概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2416982/

相关文章:

c# - 从列表<Control>获取字典<string,string>

c# - 集合迭代期间出现异常并从该集合中删除项目

c# - 为什么 lambda 语句周围的括号会导致语法错误?

c# - LINQ:将数组 [,] 转换为数组 []

c - 为什么 "kill -15"有时会失败?

vb.net - 创建一个在另一个线程上运行的进度条,同时在主线程中保持计算

c# - 如何将C# datetimeOffset 转换为指定格式

java - 如何在多个线程之间安全地共享 ArrayDeque?

java - 如何创建同步数组列表

c# - 一个进程中的线程数量正常吗?