1

当我尝试同时处理多个文件时(它们同时被创建并转储到一个文件夹中),我的服务就会终止。

当我没有尝试使用线程并且在 Watcher_Created 事件中进行了所有处理(ProcessFiles 方法中的代码现在所在的位置)时,至少有一个文件成功通过。

当我添加线程时(我很确定我必须为此做,但完全不确定使用线程的确切流程和语法),我在我的 ProcessFiles 方法中得到以下消息:

System.ArgumentException:空路径名不合法。在 System.IO.FileStream.Init(字符串路径、FileMode 模式、FileAccess 访问、Int32 权限、Boolean useRights、FileShare 共享、Int32 bufferSize、FileOptions 选项、SECURITY_ATTRIBUTES secAttrs、String msgPath、Boolean bFromProxy、Boolean useLongPath)

上面的 msg 出现在 using 行:

private static void ProcessFiles()
        {
            try
            {
Thread.Sleep(500);

GetCruiseLineShipName(fullFileName, ref cruiseLine, ref shipName);
using (StreamReader sr = new StreamReader(File.Open(fullFileName, FileMode.Open, FileAccess.Read, FileShare.Read)))

这很明显,因为“fullFileName”是一个空字符串。但是,它确实在 Watcher_Created 事件中设置:

private static void Watcher_Created(object sender, FileSystemEventArgs e)
        {
            fullFileName = e.FullPath;
        }

所以,我不明白为什么 fullFileName 变量是一个空字符串。我知道它一定与我正在尝试的线程有关。

我的 OnStart 事件如下所示:

protected override void OnStart(string[] args)
        {
            FileSystemWatcher Watcher = new FileSystemWatcher(@"C:\DropOff_FTP\MIS");

            Watcher.EnableRaisingEvents = true;
            Watcher.Created += new FileSystemEventHandler(Watcher_Created);
            Watcher.Filter = "*.txt";
            Watcher.IncludeSubdirectories = false;
            Watcher.InternalBufferSize = 64;

            Thread t = new Thread(new ThreadStart(ProcessFiles));
            t.Start();
        }

有人可以告诉我如何使用 FileSystemWatcher 来处理同时转储在那里的多个文件。如果我需要使用线程,您能否根据上面的代码提供我将如何使用线程?

顺便说一句,我正在使用 4.0 框架。

4

1 回答 1

2

从概念上讲,这里有问题。如果我理解正确,您在同一个文件夹中创建了两个时间差很短的文件。然后您收到第一个事件并在全局变量 fullFileName 中设置一个文件的名称,并且您希望正在运行的线程使用全局变量处理此文件,但同时发生另一个事件 Created 并且您更改了全局变量单独的线程正在处理

我将尝试以这种方式更改您的代码:

OnStart方法释放了启动线程的代码

Watcher_Created事件将启动传递引发事件的文件名的线程

.....
Thread t = new Thread(ProcessFiles);
t.Start(e.FullPath);
.....

ProcessFiles接收带有要处理的文件名的参数...

public void ProcessFiles(object argument) 
{
      string fullFileName = (string)argument;
      GetCruiseLineShipName(fullFileName, ref cruiseLine, ref shipName);
      using (StreamReader sr = new StreamReader(File.Open(fullFileName, ....))
      .....
}
于 2012-12-26T23:27:25.613 回答