2013-10-15 3 views
0
public delegate string AsyncMethodCaller(int callDuration, out int threadId); 

class Program 
{ 
    static void Main(string[] args) 
    { 
     int threadId; 

     AsyncMethodCaller caller = new AsyncMethodCaller(TestMethod); 

     IAsyncResult result = caller.BeginInvoke(3000, 
      out threadId, new AsyncCallback(Callback), null); 

     Console.WriteLine("Main thread {0} does some work.", 
      Thread.CurrentThread.ManagedThreadId); 

     string returnValue = caller.EndInvoke(out threadId, result); 

     Console.WriteLine("The call executed on thread {0}, with return value \"{1}\".", 
      threadId, returnValue); 
    } 

    static public string TestMethod(int callDuration, out int threadId) 
    { 
     Console.WriteLine("Test method begins."); 
     Thread.Sleep(callDuration); 
     threadId = Thread.CurrentThread.ManagedThreadId; 
     return String.Format("My call time was {0}.", callDuration.ToString()); 
    } 

    static void Callback(IAsyncResult result) 
    { 
     int a = 5; 
     int b = 20; 

     int c = a + b; 

     Console.WriteLine(c + Environment.NewLine); 
    } 
} 

이 코드는 기본적으로 TestMethod를 비동기 적으로 실행합니다. 하지만 문제는 호출자가 EndInvoke를 호출 한 후 주 스레드가 멈추고 TestMethod가 작업을 완료 할 때까지 기다리는 것입니다. 그래서 기본적으로 전체 응용 프로그램이 붙어 있습니다. 이 프로세스를 비동기 적으로 만들 수 있습니까? ? 내가 원하는 것은 비동기 적으로 어떤 메소드를 호출 한 다음 콜백을 기다리는 것이지만 EndInvoke 콜을 제거하면 콜백에 영향을 미치지 않는다는 것을 의미한다. 이 상황에서 가장 좋은 방법은 무엇입니까?비동기 위임 호출 및 콜백

+0

콜백이 명중되지 않습니다. UI 스레드가 항상 실행 중이기 때문에 GUI 응용 프로그램에서는 일반적으로 문제가되지 않습니다. 루프를 추가하여 작업을 수행하는 주 스레드를 시뮬레이트해야합니다. 콜백이 호출 될 때 그것은 여전히 ​​살아있을 것입니다. –

+1

EndNavoke가 차단 될 수 있으므로 [동기 메서드를 비동기 적으로 호출] (http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx)의 정확한 예제처럼 보입니다. 사용자 인터페이스를 서비스하는 스레드에서 호출하십시오. **. 나중에 비동기 호출이 완료 될 때 __ 콜백 메소드를 실행하는 방법을 보여주는 __이 있습니다. 그러나 'TPL'을 사용하지 않으시겠습니까? – Harrison

답변

0

작업 및 Task.Wait 메서드를 사용하는 것이 좋습니다. http://msdn.microsoft.com/ru-ru/library/dd321424.aspx

같이 smthing : 메인 스레드가 종료 되었기 때문에

var returnValue = Task<string>.Factory.StartNew(() => TestMethod()); 
+0

콜백은 어떻게됩니까? TestMethod가 실행을 마쳤을 때 콜백이 필요합니다. – Dimitri

+0

@Dima http://msdn.microsoft.com/ru-ru/library/dd321474.aspx 같은 것을 시도해보십시오 : 'tsk = new Task (TestMethod); Tasl tskCont = tsk.ContinueWith (콜백); ' –

+0

어쨌든 TPL에 관한 모든 것 같습니다. –