如何订阅任务中的事件

问题描述:

我是新来的多线程/异步处理,所以如果有比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 
    } 

我怎样才能订阅DriveFormatNeeded事件从主项目(其中Task.Factory.StartNew()是)?或者我接近完全错误?

注意:这个问题是关于如何订阅任务中的事件(或者如何从多线程角度更好地设计这个事件)。这个问题不是关于我不应该从C#格式化驱动器的原因 - 我已经关闭了这个对话。

谢谢!

+0

如果您确实订阅了“此处”,那么您可能已经错过了可能已经引发的部分或全部事件。 –

+0

好点。编辑以反映第一个订阅 – BrianH

+0

首先,您应该在调用'Main'方法之前使用'Task.Run'并结合运行,订阅该事件。你需要问自己的问题是,当Main方法执行时你会做什么?只是你知道,异步并不是多线程。异步可以在没有线程的情况下实现。 – CodingYoshi

//How can I subscribe to DriveFormatNeeded here?? 
DriveFormatter.DriveFormatter.DriveFormatNeeded += MyHandler; 
Task t = ... 

但是这里有很多值得思考的地方。一般情况下,您应该避免使用static数据和事件,控制台应用程序中的Task.Run()可疑等。

此外,请尽量避免对类及其命名空间使用相同的名称。