C# 如何在Windows服务中连续读取文本文件

C# 如何在Windows服务中连续读取文本文件,c#,io,windows-services,text-files,streamreader,C#,Io,Windows Services,Text Files,Streamreader,我正在windows服务中读取一个文本文件。根据我的要求,我必须逐行读取文本文件,处理该行的内容并插入数据库。文本文件的性质是不断更新。有时在一分钟内会添加100行,有时不会。因此没有固定的速率在哪些行插入到文本文件中。 目前,我正在使用while循环使用StreamReader逐行读取文本文件,但一行读过就会返回。下面是我的windows服务结构 public partial class Service1 : ServiceBase { public Service1() {

我正在windows服务中读取一个文本文件。根据我的要求,我必须逐行读取文本文件,处理该行的内容并插入数据库。文本文件的性质是不断更新。有时在一分钟内会添加100行,有时不会。因此没有固定的速率在哪些行插入到文本文件中。 目前,我正在使用while循环使用
StreamReader
逐行读取文本文件,但一行读过就会返回。下面是我的windows服务结构

public partial class Service1 : ServiceBase
{
    public Service1()
    {
        InitializeComponent();
    }

    private System.Threading.Thread _thread;
    private ManualResetEvent _shutdownEvent = new ManualResetEvent(false);
    public void OnDebug()
    {
        OnStart(null);
    }

    protected override void OnStart(string[] args)
    {
        _thread = new Thread(parseAndProcess);
        _thread.Start();
    }
    public void parseAndProcess()
    {      
        if (System.IO.File.Exists(FileToCopy) == true)
        {

            using (StreamReader reader = new StreamReader(FileToCopy))
            {

                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    if (line != "")
                    {
                       //line processing logic goes here            
                    }
                    reader.Close();
                }
            } 
       }
    }

    protected override void OnStop()
    {
         _shutdownEvent.Set();
        _thread.Join();  // wait for thread to stop
    }
}
}
这是我的windows服务的整个结构。如果此时文本文件中没有下一行可用,读取将停止,直到服务重新启动为止,我不想这样做。 所以,如果streamreader停止读取行,我如何检查文件更新

这是我用FileSystemWatcher更新的代码

protected override void OnStart(string[] args)
    {

        _thread = new Thread(parseAndProcess);
        _thread.Start();


        FileSystemWatcher Watcher = new FileSystemWatcher("File Path");
        Watcher.EnableRaisingEvents = true;
        Watcher.Changed += new FileSystemEventHandler(Watcher_Changed);



    }

    // This event is raised when a file is changed
    private void Watcher_Changed(object sender, FileSystemEventArgs e)
    {
        _thread = new Thread(parseAndProcess);
        _thread.Start();
    }
在这段代码中,当被FileSystemWatcher Changed事件调用时,我怀疑如何只读取添加到文本文件中的新行。
请提供帮助。

创建文件的私有副本,这样文件就可以被其他进程打开更改

处理副本

删除副本

如果原始文件已更改(可以使用FileSystemWatcher),请重复并不要处理已处理的行

检测已经处理的行可能是最困难的,但这取决于系统的幂等性和文件的实际内容

幂等性意味着在多次传递同一行时,要将行馈送到的系统(数据库)不会改变


识别同一行取决于行的内容。它可能是行号、GUID、ID、时间戳

您可以尝试使用类和事件来监视对所需文件的更改。@Yuriy如何使用此命令读取新添加的行?@Yuriy我已使用FileSystemWatcher和changed event更新了代码。这是正确的方法吗?如果是:如何仅读取文本文件的新添加行。