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 呼び出しを削除すると、CallBack はヒットしません。この状況でのベストプラクティスは何ですか。