ActorProxy.cs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using System;
  2. using System.Threading.Tasks;
  3. namespace Model
  4. {
  5. public sealed class ActorProxy : Entity
  6. {
  7. public string Address;
  8. public ActorProxy(long id): base(id)
  9. {
  10. }
  11. public void Send<Message>(Message message) where Message : AActorMessage
  12. {
  13. Session session = Game.Scene.GetComponent<NetInnerComponent>().Get(this.Address);
  14. session.Send(message);
  15. }
  16. public async Task<Response> Call<Request, Response>(Request request) where Request : AActorRequest where Response: AActorResponse
  17. {
  18. try
  19. {
  20. Response response = null;
  21. if (this.Address == "")
  22. {
  23. this.Address = await this.Parent.GetComponent<LocationProxyComponent>().Get(this.Id);
  24. }
  25. response = await OnceCall<Request, Response>(0, request);
  26. return response;
  27. }
  28. catch (RpcException e)
  29. {
  30. Console.WriteLine(e);
  31. throw;
  32. }
  33. }
  34. public async Task<Response> OnceCall<Request, Response>(int retryTime, Request request) where Request : AActorRequest where Response : AActorResponse
  35. {
  36. Response response = null;
  37. if (retryTime > 0)
  38. {
  39. await this.Parent.GetComponent<TimerComponent>().WaitAsync(retryTime * 500);
  40. this.Address = await this.Parent.GetComponent<LocationProxyComponent>().Get(this.Id);
  41. }
  42. Session session = Game.Scene.GetComponent<NetInnerComponent>().Get(this.Address);
  43. response = await session.Call<Request, Response>(request);
  44. if (response.Error == ErrorCode.ERR_Success)
  45. {
  46. return response;
  47. }
  48. if (retryTime >= 3)
  49. {
  50. throw new RpcException(response.Error, response.Message);
  51. }
  52. if (response.Error == ErrorCode.ERR_NotFoundActor)
  53. {
  54. response = await OnceCall<Request, Response>(++retryTime, request);
  55. }
  56. throw new RpcException(response.Error, response.Message);
  57. }
  58. public override void Dispose()
  59. {
  60. if (this.Id == 0)
  61. {
  62. return;
  63. }
  64. base.Dispose();
  65. }
  66. }
  67. }