2017-10-11 5 views
-1

멀티 스레딩/비동기 처리가 처음이므로 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'과 withing을 사용해야합니다. 이벤트에 가입하십시오. 'Main' 메쏘드가 실행되는 동안 무엇을 할 것인가에 대해 스스로에게 묻고 싶은 질문이 있습니까? 비동기는 멀티 스레딩이 아닙니다. 비동기는 스레드없이 수행 될 수 있습니다. – CodingYoshi

답변

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

여기에 대해 많이 생각해보십시오. 일반적으로 static 데이터 및 이벤트를 피하는 것이 좋습니다. Console 응용 프로그램의 Task.Run()은 의심 스럽습니다.

또한 클래스와 해당 네임 스페이스에 동일한 이름을 사용하지 마십시오.