1

同時に2つ以上のファイルを処理しようとすると(それらは同時に作成され、フォルダーにダンプされます)、サービスが停止します。

スレッドを使用しようとしておらず、Watcher_Createdイベントですべての処理(ProcessFilesメソッドのコードが現在ある場所)があった場合、少なくとも1つのファイルが正常に処理されます。

スレッドを追加すると(これを行う必要があると確信していますが、スレッドを使用した正確なフローと構文が完全にわかりません)、ProcessFilesメソッドで次のメッセージを取得します。

System.ArgumentException:空のパス名は無効です。System.IO.FileStream.Init(String path、FileMode mode、FileAccess access、Int32 rights、Boolean useRights、FileShare share、Int32 bufferSize、FileOptions options、SECURITY_ATTRIBUTES secAttrs、String msgPath、Boolean bFromProxy、Boolean useLongPath)

上記のメッセージは、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

概念的には、ここで何かが間違っています。私があなたを正しく理解しているなら、あなたは短い時間差で同じフォルダに2つのファイルを作成しています。次に、最初のイベントを受け取り、グローバル変数fullFileNameに1つのファイルの名前を設定し、実行中のスレッドがグローバル変数を使用してこのファイルを処理することを期待しますが、同時に別のイベント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 に答える