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

标签 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 worker = new Worker();
        Thread thread = new Thread(worker.Run);
        thread.Start();
        Console.ReadLine(); // something else more interesting would go here.

原因是Run方法结束而不是进入某种事件循环。我如何获得一个事件循环。 (我想我正在寻找类似Application.Run的东西)

最佳答案

未经测试,但是如果您希望“事件”循环在线程上运行,它将看起来像这样:

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方法。

关于c# - 如何在第二个线程上等待事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1208560/

相关文章:

javascript - 从 JavaScript 代码执行 Genexus 的事件

java - 如何使用来自 URL 的数据填充 javaFX 中的 ListView?

Java多线程 - 单数组更新

javascript - 如何在包含事件的情况下使用其他参数

c# - .NET是否有任何免费的OCR API?

c# - 将已构建的 WinForms.Form 实例序列化为 VB 或 C# 源代码,就像 IDE 一样

c# - 当 BoundField 为零时禁用 ButtonField

c# - Microsoft SQL Server 如何将数据从一个表复制到另一个表

python-3.x - 如何使多个对象同时工作?

html - HTML 事件和 JavaScript 事件的区别