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