在名为Worker
的类中考虑以下代码 FileSystemWatcher watcher = new FileSystemWatcher();
public void Run()
{
watcher.Path = @"c:\queue";
watcher.Created += new FileSystemEventHandler(watcher_Created);
watcher.EnableRaisingEvents = true;
}
现在这就是我想和工人一起做的事,但显然这不会飞。
Worker worker = new Worker();
Thread thread = new Thread(worker.Run);
thread.Start();
Console.ReadLine(); // something else more interesting would go here.
原因是Run方法结束而不是进入某种事件循环。如何进行事件循环。 (我想我正在寻找像Application.Run这样的东西)
答案 0 :(得分:2)
没有经过测试,但是你的“事件”循环,如果你想让它在线程上运行,会看起来像这样:
private bool running = true;
private AutoResetEvent waiter = new AutoResetEvent(false);
public void Run()
{
FileSystemWatcher watcher = new FileSystemWatcher("C:\\");
FileSystemEventArgs changes = null;
watcher.Changed +=
(object sender, FileSystemEventArgs e) => {
changes = e;
waiter.Set();
};
watcher.EnableRaisingEvents = true;
while (running)
{
waiter.WaitOne();
if (!running) break;
Console.WriteLine("Path: {0}, Type: {1}",
changes.FullPath, changes.ChangeType);
}
Console.WriteLine("Thread complete");
}
public void Stop()
{
running = false;
waiter.Set();
}
您可以将此代码放在一个类中,并在单独的线程上运行它(如果您愿意)。如果你想让你的主线程在你创建的线程上等待(虽然为什么在这种情况下创建一个线程呢?)然后你可以使用Thread.Join方法。
答案 1 :(得分:1)
从MSDN
拉出来Worker worker = new Worker();
Thread thread = new ThreadStart(worker.Run);
thread.Start();
// Not sure if you need this while
while (!oThread.IsAlive);
oThread.Join();
Console.ReadLine();
答案 2 :(得分:0)
BackgroundWorker与RunAsync()一起使用时,将在单独的线程上运行您的逻辑。
您想要与涉及事件循环的工作人员一起实现什么? FileSystemWatcher已经基本上为你执行了一个事件循环,所以你不清楚你在这里想要实现的目标。
答案 3 :(得分:0)
你可以不让Run()方法结束,直到应用程序准备好关闭?也许更像是:(对不起,但是我不是通过IDE中的内存来绑定它,所以它可能不完美):
public void Run()
{
watcher.Path = @"C:\queue";
watcher.Created += new FileSystemEventHandler(watcher_Created);
watcher.EnableRaisingEvents = true;
try
{
while(true)
Thread.Sleep();
}
catch(ThreadAbortedException)
{
return;
}
}
和跑步者:
Worker worker = new Worker();
Thread thread = new Thread(worker.Run);
thread.Start();
Console.ReadLine(); // something else more interesting would go here.
thread.Abort(); // do when ready to close the app.
第二个想法,你为什么要开始一个新线程来做这个?为什么不呢:
watcher.Path = @"C:\queue";
watcher.Created += new FileSystemEventHandler(watcher_Created);
watcher.EnableRaisingEvents = true;
Console.ReadLine(); // something else more interesting would go here.
或者将FileSystemWatcher放在一个不会超出范围的变量中(如果是WinForms应用程序,则在主窗体上,或者如果控制台应用程序,则为任何类具有Main()方法)。
或者还有其他东西在这里没有显示?