[英]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.