C#捕获任务中的事件
本文关键字:事件 任务 | 更新日期: 2023-09-27 18:27:20
这是我写的一些代码。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。