|
|
@@ -134,6 +134,71 @@ namespace Model
|
|
|
|
|
|
this.network.MessageDispatcher.Dispatch(this, op, offset, messageBytes, (AMessage)message);
|
|
|
}
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Rpc调用,发送一个消息,等待返回一个消息
|
|
|
+ /// </summary>
|
|
|
+ public Task<AResponse> Call(ARequest request)
|
|
|
+ {
|
|
|
+ request.RpcId = ++RpcId;
|
|
|
+ this.SendMessage(request);
|
|
|
+
|
|
|
+ var tcs = new TaskCompletionSource<AResponse>();
|
|
|
+ this.requestCallback[RpcId] = (message) =>
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ AResponse response = (AResponse)message;
|
|
|
+ if (response.Error > 100)
|
|
|
+ {
|
|
|
+ tcs.SetException(new RpcException(response.Error, response.Message));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ //Log.Debug($"recv: {MongoHelper.ToJson(response)}");
|
|
|
+ tcs.SetResult(response);
|
|
|
+ }
|
|
|
+ catch (Exception e)
|
|
|
+ {
|
|
|
+ tcs.SetException(new Exception($"Rpc Error: {message.GetType().FullName}", e));
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ return tcs.Task;
|
|
|
+ }
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// Rpc调用
|
|
|
+ /// </summary>
|
|
|
+ public Task<AResponse> Call(ARequest request, CancellationToken cancellationToken)
|
|
|
+ {
|
|
|
+ request.RpcId = ++RpcId;
|
|
|
+ this.SendMessage(request);
|
|
|
+
|
|
|
+ var tcs = new TaskCompletionSource<AResponse>();
|
|
|
+
|
|
|
+ this.requestCallback[RpcId] = (message) =>
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ AResponse response = (AResponse)message;
|
|
|
+ if (response.Error > 100)
|
|
|
+ {
|
|
|
+ tcs.SetException(new RpcException(response.Error, response.Message));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ //Log.Debug($"recv: {MongoHelper.ToJson(response)}");
|
|
|
+ tcs.SetResult(response);
|
|
|
+ }
|
|
|
+ catch (Exception e)
|
|
|
+ {
|
|
|
+ tcs.SetException(new Exception($"Rpc Error: {request.GetType().FullName}", e));
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ cancellationToken.Register(() => { this.requestCallback.Remove(RpcId); });
|
|
|
+
|
|
|
+ return tcs.Task;
|
|
|
+ }
|
|
|
|
|
|
/// <summary>
|
|
|
/// Rpc调用
|