2017-10-11 7 views
-1

私はマルチスレッド/非同期処理の初心者です。これを行うにはTask.Factory.StartNew()よりも良い方法があれば教えてください。タスク内のイベントを購読する方法

私のソリューションには2つのプロジェクトがあります。 2番目のプロジェクトを最初の子スレッドとして開始したいと思います。だから、私は、プログラムを開始し、メインスレッドは、子スレッドで2番目のプロジェクトを開始します。その2番目のプログラムには、メインスレッドの購読を希望するイベントがありますが、どうすればよいか分かりません。

コード:私は(Task.Factory.StartNewは()である)、メインプロジェクトからDriveFormatNeededイベントをサブスクライブするにはどうすればよい

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 
    } 

?それとも私はこれに完全に間違っているのだろうか?

注:この質問は、タスクのイベントを購読する方法(またはマルチスレッドの観点からこれをよりうまく設計する方法)に関するものです。この質問は、C#からドライブをフォーマットするべきではない理由ではありません。私はすでにその会話を終了しています。

ありがとうございます!

+0

「こちら」を購読していた場合、すでに発生している可能性のあるイベントの一部またはすべてが欠落している可能性があります。 –

+0

良い点。最初に登録することを反映するように編集しました – BrianH

+0

まず、 'Main'メソッドを呼び出す前に' Task.Run'と 'run'を使って、イベントを購読する必要があります。 'Main'メソッドが実行されている間にあなたは何をしますか?そして、あなたが知っている通り、非同期はマルチスレッドではありません。非同期はスレッドなしで達成できます。 – CodingYoshi

答えて

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

ここで考えるべきことはたくさんあります。 staticのデータとイベントは避けてください。コンソールアプリケーションのTask.Run()は疑問です。

また、クラスとその名前空間に同じ名前を使用しないようにしてください。

関連する問題