【问题标题】:C# Catch Events from TasksC# 从任务中捕获事件
【发布时间】:2015-12-17 15:02:14
【问题描述】:

这是我写的一些代码。 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# multithreading events task


    【解决方案1】:

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

    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。

    【讨论】:

      猜你喜欢
      • 2011-05-14
      • 2012-11-09
      • 2018-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多