C#捕获任务中的事件

本文关键字:事件 任务 | 更新日期: 2023-09-27 18:27:20

这是我写的一些代码。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);
}

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

这是正确的方法吗?

C#捕获任务中的事件

为什么不应该捕获它?只需确保注册所有实例的事件即可。

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。