簡體   English   中英

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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM