1)同步方案:利用EndInvoke进行阻塞获得返回值:
int DDSync()
{
Logger.Debug("1-sync");
System.Threading.Thread.Sleep(9999);
Logger.Debug("2-sync");
return 11;
}
Func<int> action = DDSync;
IAsyncResult asyncResult = action.BeginInvoke(null, null);
int result = action.EndInvoke(asyncResult); // 阻塞当前线程直到异步执行结束
Logger.Debug(result);
2)同步方案:利用信号量阻塞获得返回值(可设定超时时间):
int DDSync()
{
Logger.Debug("1-sync");
System.Threading.Thread.Sleep(9999);
Logger.Debug("2-sync");
return 11;
}
Func<int> action = DDSync;
IAsyncResult asyncResult = action.BeginInvoke(null, null);
asyncResult.AsyncWaitHandle.WaitOne(-1); // 阻塞当前线程直到异步执行结束
int result = action.EndInvoke(asyncResult);
Logger.Debug(result);
3)异步方案:利用AsyncCallback在异步调用完成后获得返回值:
int DDAsync()
{
Logger.Debug("1-sync");
System.Threading.Thread.Sleep(9999);
Logger.Debug("2-sync");
return 11;
}
Func<int> action = DDAsync;
AsyncCallback callback = ar =>
{
Logger.Debug(ar.AsyncState as string);
Logger.Debug("3-sync");
int result = action.EndInvoke(ar);
Logger.Debug(result);
};
IAsyncResult asyncResult = action.BeginInvoke(callback, "params"); // 异步调用,不阻塞
但是这些个方法不在.NET Core中使用。