1

當我嘗試和過程比在同一時間(創建它們,並在同一時間的文件夾中傾倒)兩個文件,我的服務更死亡。有一個問題,在Windows服務處理多個文件一次用FileSystemWatcher的

當我是不是要使用一個線程,並把所有的處理(其中在ProcessFiles方法現在該代碼)在Watcher_Created事件中,至少有一個文件獲得通過成功。

當我加入線程(我敢肯定,我有這事,但我完全不能確定使用線程確切流和語法的),我得到以下味精在我ProcessFiles方法:

System.ArgumentException:空路徑名稱不合法。 在System.IO.FileStream.Init(字符串路徑,模式的FileMode,FileAccess的訪問,的Int32權利,布爾useRights,文件共享份額,緩衝區大小的Int32,FileOptions選項,SECURITY_ATTRIBUTES secAttrs,字符串MSGPATH,布爾bFromProxy,布爾useLongPath)

上述MSG發生在使用線:

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的處理被同時傾倒在那裏的多個文件。如果我需要使用線程,可否請您提供如何使用基於上述代碼的線程?

btw,我使用的是4.0框架。

回答

2

概念什麼是錯在這裏。如果我正確理解你,你有兩個文件創建在同一個文件夾中,但時間差異很小。然後您會收到第一個事件,並在全局變量fullFileName設置一個文件的名字,你想到的是,正在運行的線程處理這個文件中使用全局變量,但在相同的時間創造了另一個事件發生,你改變了全局變量的單獨的線程中處理

我會嘗試改變這種方式,你的代碼:

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, ....)) 
     ..... 
} 
+0

史蒂夫,感謝這麼多的答覆....我格式化代碼如你所說。但是,如果我在t上包含一個參數。開始(如上所述),「Thread t = new Thread(new ThreadStart(ProcessFiles))」給了我一個設計時間編譯錯誤:「ProcessFiles沒有重載匹配委託'System.Threading.ThreadStart',這意味着我可以'我知道iwht t.Start,有一個選項可以包含一個參數,我們在這裏丟失了什麼? – sagesky36

+0

對不起,但是複製/粘貼。檢查更新。不需要使用ThreadStart,只傳遞方法名稱,編譯器會推斷出適當的委託(ParametrizedThreadStart) – Steve

+0

如果我嘗試按照你的方式運行它,服務只停在t.Start方法上,出現以下錯誤:「ex = {」線程已創建「}」 – sagesky36

相關問題