gpt4 book ai didi

c# - 如何同步 FileSystemWatcher

转载 作者:行者123 更新时间:2023-11-30 17:13:45 26 4
gpt4 key购买 nike

我有这段代码我想在插件的 StartWatch() 和 OnFinalChanged() 之间同步,所以最终将按以下顺序打印:

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
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)
{
// I need StartWatch to be called only after i got OnChanged() for the previous plugin
plugin.StartWatch();
}
}
}


public class Plugin
{
private FileSystemWatcher _watcher;
private readonly string _file;

public Plugin(string file)
{
_file = file;
Console.WriteLine("Creating plugin for file {0}", _file);
}

public void StartWatch()
{
Console.WriteLine("Starting watching {0}", _file);
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;
}
// i want the main thread to be paused untill i get the OnChanged()
}

private void OnChanged(object source, FileSystemEventArgs e)
{
Console.WriteLine("Finished watching file {0}", _file);
_watcher.Dispose();

// once i get this event, i want the main thread to continue and to start watching the same plugin
}
}
}

最佳答案

使用 AutoResetEvent应该完成这项工作。

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)
{
// I need StartWatch to be called only after i got OnChanged() for the previous plugin
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;
}
// i want the main thread to be paused untill i get the OnChanged()
}

private void OnChanged(object source, FileSystemEventArgs e)
{
Console.WriteLine("Finished watching file {0}", _file);
_watcher.Dispose();

// once i get this event, i want the main thread to continue and to start watching the same plugin
WaitHandler.Set();
}
}
}

关于c# - 如何同步 FileSystemWatcher,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9518028/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com