我是多线程/异步处理的新手,所以如果有比Task.Factory.StartNew()更好的方法,请告诉我。
我的解决方案中有 2 个项目。我想将第二个项目作为第一个项目的子线程启动。所以,我希望程序启动,然后主线程在子线程上启动第二个项目。第二个程序有一个事件,我希望主线程订阅,但我不知道如何。
法典:
public class Program //First project
{
//Test data
static TimeSpan formatTime = new TimeSpan(0, 0, 0); //Midnight
static char driveLetter = 'z';
static Format f = Format.FAT32;
static string name = "Test";
//End test data
public static void Main(string[] args)
{
//How can I subscribe to DriveFormatNeeded here??
Task t = Task.Factory.StartNew(() => DriveFormatter.DriveFormatter.Main(formatTime, driveLetter, f, name), TaskCreationOptions.LongRunning);
}
}
_
public class DriveFormatter //Project 2
{
public static event EventHandler<CharEventArgs> DriveFormatNeeded;
public static void Main(TimeSpan formatTime, char driveLetter, Format format, string driveName)
{
//Do stuff that will eventually raise DriveFormatNeeded event
}
如何从主项目(Task.Factory.StartNew() 所在的位置)订阅 DriveFormatRequired 事件?还是我的做法完全错误?
注意:这个问题是关于如何订阅任务中的事件(或者如何从多线程的角度更好地设计)。这个问题不是关于我不应该从 C# 格式化驱动器的原因 - 我已经在那个对话中了。
提前谢谢你!!
//How can I subscribe to DriveFormatNeeded here??
DriveFormatter.DriveFormatter.DriveFormatNeeded += MyHandler;
Task t = ...
但是这里有很多事情要考虑。通常,您应该避免static
数据和事件,控制台应用程序中的 Task.Run() 是可疑的,等等。
此外,尽量避免对类及其命名空间使用相同的名称。