如何在第二个线程上等待事件

时间:2009-07-30 18:47:08

标签: c# multithreading events

在名为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这样的东西)

4 个答案:

答案 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()方法)。

或者还有其他东西在这里没有显示?