当我尝试同时处理多个文件时(它们同时被创建并转储到一个文件夹中),我的服务就会终止。
当我没有尝试使用线程并且在 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 框架。