C#从任务捕获事件

C#从任务捕获事件,c#,multithreading,events,task,C#,Multithreading,Events,Task,这是我写的一些代码。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

这是我写的一些代码。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);
}
也会起到同样的作用,只要其中一个废话需要记录,它就会记录下来。 问题在于方法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