这是我写的一些代码。 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);
}
这会起作用吗?如果我添加更多对象实例?我的意思是据我所知,任务可以在一个单独的线程上运行,因此事件可能无法正确捕获?
这是正确的方法吗?
答案 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。