2013-06-14 3 views
0

방금 ​​첫 번째 다중 스레드 프로그램을 만들었으므로 작동하지 않습니다. 다음은 최소 완성 프로그램입니다. 제가하려고하는 것을 그려 냈습니다.비동기 이벤트가 콘솔에 출력되지 않습니다.

기본적으로 나는 인수를 취하지 않고 문자열을 반환하는 대리인을 만들었습니다. 위의 대리자의 메서드 서명과 일치하는 세 가지 메서드 (FirstMessage, SecondMessageThirdMessage) 세 가지 메서드가 포함 된이 대리자 형식의 이벤트입니다.

마지막으로 이벤트의 각 메서드를 비동기 적으로 실행하고 반환 된 값을 표시하는 메서드 Start을 만들었습니다. 그러나 프로그램은 아무 것도 출력하지 않습니다. 내가 뭔가를 오해하고 있니? 사전에

using System; 

class Program 
{ 
    delegate string Message(); 
    static event Message MyMessage; 

    static string FirstMessage() 
    { 
     System.Threading.Thread.Sleep(1000); 
     return "Message 1"; 
    } 
    static string SecondMessage() 
    { 
     System.Threading.Thread.Sleep(2000); 
     return "Message 2"; 
    } 
    static string ThirdMessage() 
    { 
     System.Threading.Thread.Sleep(3000); 
     return "Message 3"; 
    } 

    static void Start() 
    { 
     foreach (Message m1 in MyMessage.GetInvocationList()) 
     { 
      Message m2 = m1; 
      m1.BeginInvoke(delegate(IAsyncResult result) 
      { 
       string msg = m2.EndInvoke(result); 
       Console.WriteLine("The message is " + msg + "."); 
      }, null); 
     } 
    } 

    static void Main() 
    { 
     MyMessage += FirstMessage; 
     MyMessage += SecondMessage; 
     MyMessage += ThirdMessage; 

     Start(); 
    } 
} 

감사 : 여기

코드입니다!

답변

2

하나의 이유는 프로그램이 백그라운드 작업이 완료 될 때까지 기다리지 않고 종료하기 때문입니다.

Main 메서드가 모든 백그라운드 작업이 완료 될 때까지 기다리는 방법을 추가해야합니다.

문제 해결을 위해서

, 단지 시작에 대한 호출 후이 추가 시도 :

Console.ReadLine(); 

을 그 메시지는 다음이 이유이다, 표시하게합니다.

정확하게이 문제를 해결하는 방법, 내가 모르는 것은 문제의 코드가 너무 고쳐서 고쳐야하기 때문입니다.

+0

이제 이해합니다. 이 일했다! –

관련 문제