로이 코드 노력하고 있습니다 잘 :멀티 스레딩 FileSystemWatching
Creating plugin for file c:\temp\file1.txt
Creating plugin for file c:\temp\file2.txt
Creating plugin for file c:\temp\file3.txt
Starting watching c:\temp\file1.txt
Finished watching file c:\temp\file1.txt
Starting watching c:\temp\file2.txt
Finished watching file c:\temp\file2.txt
Starting watching c:\temp\file3.txt
Finished watching file c:\temp\file3.txt
: 코드에서 인쇄
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading;
namespace Test2
{
internal static class MyProgram
{
[STAThread]
private static void Main(string[] args)
{
List<Plugin> plugins = new List<Plugin>
{
new Plugin(@"c:\temp\file1.txt"),
new Plugin(@"c:\temp\file2.txt"),
new Plugin(@"c:\temp\file3.txt"),
};
foreach (var plugin in plugins)
{
plugin.StartWatch();
plugin.WaitHandler.WaitOne();
}
}
}
public class Plugin
{
private FileSystemWatcher _watcher;
private readonly string _file;
public AutoResetEvent WaitHandler { get; private set; }
public Plugin(string file)
{
_file = file;
Console.WriteLine("Creating plugin for file {0}", _file);
WaitHandler = new AutoResetEvent(false);
}
public void StartWatch()
{
Console.WriteLine("Starting watching {0}", _file);
WaitHandler.Reset();
FileInfo fileInfo = new FileInfo(_file);
if (fileInfo.Directory != null)
{
_watcher = new FileSystemWatcher(fileInfo.Directory.FullName, fileInfo.Name);
_watcher.NotifyFilter = NotifyFilters.LastWrite;
_watcher.Changed += OnChanged;
_watcher.EnableRaisingEvents = true;
}
}
private void OnChanged(object source, FileSystemEventArgs e)
{
Console.WriteLine("Finished watching file {0}", _file);
_watcher.Dispose();
WaitHandler.Set();
}
}
}
결과는 (제대로 작동하고 중요되는) 다음이다
내가 가진 문제는 내 프로그램을 멀티 스레드로 만들고 다른 스레드가 백그라운드에서 실행되도록하려는 것입니다. 주 스레드가 AutoResetEvent에 의해 차단되기 때문에이 디자인으로는 작업을 수행 할 수 없습니다. 내가 추가하고 싶은 다른 스레드는 "AbortFlagFile.txt"라는 파일을 수신하는 스레드입니다. 한 번 "AbortFlagFile.txt"수정보다 내 프로그램을 중단해야합니다. OnChange()가 끝난 후 해고 될 PluginEndEvent를 생성하려고 생각했습니다.
내가 쓴 것과 같은 순서로 로그를 생성한다는 것은 매우 중요합니다. 감사합니다!