2017-10-11 10 views
-1

Je suis novice dans le traitement multithreading/asynchrone, donc s'il y a une meilleure façon de procéder que Task.Factory.StartNew(), faites-le moi savoir.Comment m'abonner à un événement dans une tâche

J'ai 2 projets dans ma solution. Je veux commencer le 2ème projet comme un fil de l'enfant à la première. Donc, je veux que le programme commence, et le thread principal pour ensuite démarrer le 2ème projet sur un thread enfant. Ce 2ème programme a un événement auquel j'aimerais que le fil principal s'abonne, mais je ne sais pas comment.

code:

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 
    } 

Comment puis-je souscrire à l'événement DriveFormatNeeded du projet principal (où Task.Factory.StartNew() est)? Ou est-ce que j'approche complètement cela?

Remarque: Cette question concerne la façon de s'abonner à des événements dans des tâches (ou comment concevoir cela mieux dans une perspective multithread). Cette question n'est pas sur les raisons pour lesquelles je ne devrais pas mettre en forme un lecteur de C# - J'ai déjà été cette conversation.

Merci d'avance !!!

+0

Si vous vous êtes abonné "ici" alors vous avez peut-être déjà manqué tout ou partie des événements qui auraient pu être déclenchés. –

+0

Bon point. Edité pour refléter d'abord l'abonnement – BrianH

+0

Tout d'abord, vous devriez utiliser 'Task.Run' et withing run, avant d'appeler la méthode' Main', abonnez-vous à l'événement. La question que vous devez vous poser est ce que vous ferez pendant l'exécution de la méthode 'Main'? Et juste pour que vous sachiez, asynchrone n'est pas multithread. L'asynchronie peut être réalisée sans filetage. – CodingYoshi

Répondre

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

Mais il y a beaucoup à penser ici. Evitez généralement les données et les événements static, Task.Run() dans une application de console est douteuse, etc.

Également, essayez d'éviter d'utiliser le même nom pour une classe et son espace de noms.