C#从任务中捕获事件

时间:2015-12-17 15:02:15

标签: 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 e)
{
    Console.WriteLine(text);
}

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

这是正确的方法吗?

1 个答案:

答案 0 :(得分:2)

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

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。