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 콜을 제거하면 콜백에 영향을 미치지 않는다는 것을 의미한다. 이 상황에서 가장 좋은 방법은 무엇입니까?비동기 위임 호출 및 콜백
콜백이 명중되지 않습니다. UI 스레드가 항상 실행 중이기 때문에 GUI 응용 프로그램에서는 일반적으로 문제가되지 않습니다. 루프를 추가하여 작업을 수행하는 주 스레드를 시뮬레이트해야합니다. 콜백이 호출 될 때 그것은 여전히 살아있을 것입니다. –
EndNavoke가 차단 될 수 있으므로 [동기 메서드를 비동기 적으로 호출] (http://msdn.microsoft.com/en-us/library/2e08f6yc.aspx)의 정확한 예제처럼 보입니다. 사용자 인터페이스를 서비스하는 스레드에서 호출하십시오. **. 나중에 비동기 호출이 완료 될 때 __ 콜백 메소드를 실행하는 방법을 보여주는 __이 있습니다. 그러나 'TPL'을 사용하지 않으시겠습니까? – Harrison