ActorTask.cs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. using System;
  2. using System.Threading.Tasks;
  3. namespace ETModel
  4. {
  5. public struct ActorTask
  6. {
  7. public ActorProxy proxy;
  8. public IMessage message;
  9. public TaskCompletionSource<IResponse> Tcs;
  10. public async Task<IResponse> Run()
  11. {
  12. Session session = Game.Scene.GetComponent<NetInnerComponent>().Get(this.proxy.Address);
  13. OpcodeTypeComponent opcodeTypeComponent = session.Network.Entity.GetComponent<OpcodeTypeComponent>();
  14. ushort opcode = opcodeTypeComponent.GetOpcode(message.GetType());
  15. byte[] requestBytes = session.Network.MessagePacker.SerializeToByteArray(message);
  16. ActorRequest actorRequest = new ActorRequest() { Id = this.proxy.Id, Op = opcode, AMessage = requestBytes };
  17. ActorResponse actorResponse = (ActorResponse)await session.Call(actorRequest, this.proxy.CancellationTokenSource.Token);
  18. if (actorResponse.Error != ErrorCode.ERR_NotFoundActor)
  19. {
  20. if (this.Tcs != null)
  21. {
  22. Type type = opcodeTypeComponent.GetType(actorResponse.Op);
  23. IResponse response = (IResponse) session.Network.MessagePacker.DeserializeFrom(type, actorResponse.AMessage);
  24. this.Tcs?.SetResult(response);
  25. }
  26. }
  27. return actorResponse;
  28. }
  29. public void RunFail(int error)
  30. {
  31. this.Tcs?.SetException(new RpcException(error, ""));
  32. }
  33. }
  34. }