C# 从任务中捕获事件

C# Catch Events from Tasks

这是我写的一些代码。 blah 对象的 Start 方法 运行 是一个无限循环,并在发生某些事情时引发事件。我想使用下面的代码捕捉事件。

static void Main(string[] args)
{
    var blah = new Blah();

    blah.SomeEvent += Log;

    Task.Factory.Start(blah.Start);

    Application.Run();
}

static void Log(string text, EventArgs e)
{
    Console.WriteLine(text);
}

如果我添加更多对象实例,这会起作用吗?我的意思是,据我所知,任务可以 运行 在一个单独的线程上,所以事件可能不会被正确捕获?

这是正确的做法吗?

为什么不应该被抓住?只需确保注册所有实例的事件。

static void Main(string[] args)
{

    var blah = new Blah();

    blah.SomeEvent += Log;

    Task.Factory.Start(blah.Start);

    var blah2 = new Blah();

    blah2.SomeEvent += Log;

    Task.Factory.Start(blah2.Start);

    Application.Run();
}

static void Log(string text, EventArgs e)
{
    Console.WriteLine(text);
}

将以同样的方式工作,只要其中一个 Blahs 有东西要记录,它就会记录。 问题在于您的方法 Log() 是否是线程安全的。 例如,如果您登录到一个文件,您应该使用:

static object loglock = new object();
static void Main(string[] args)
{

    var blah = new Blah();

    blah.SomeEvent += Log;

    Task.Factory.Start(blah.Start);

    var blah2 = new Blah();

    blah2.SomeEvent += Log;

    Task.Factory.Start(blah2.Start);

    Application.Run();
}

static void Log(string text, EventArgs e)
{
    lock(loglock)
    {
        // write to file
    }
}

补充:另外,如果您想操作控件,您应该像往常一样使用 Invoke。