RPC框架,就是远程调用一个方法就像是本地调用一样。

用于网络消息的话,那么你的收发消息通过异步方法可以写在一起,很方便

核心代码

using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading.Tasks;
using DragonBones;
using UnityEngine; /// <summary>
/// Test实现RPC框架
/// </summary>
public class TestTask : MonoBehaviour
{
private readonly Dictionary<string, Action<object>> requestCallback = new Dictionary<string, Action<object>>(); // Start is called before the first frame update
void Start()
{
TestAsync();
} //异步方法
async void TestAsync()
{
object data = await MyTestTask();//await回调返回的方法
Debug.Log("执行完毕,收到的数据为" + data);
} //这个地方我用了object,会有装箱操作,当然ET填的的是一个接口interface,你也可以选择填一个接口
//返回的数据包必须是一个类结构,继承这个接口,然后在里面进行一次隐式转换,就能拿到原有类的对象了
//如果传回来的类不是个接口,比如字典嵌套类(当然很少有人这样做),需要针对字典,List这种 做个优化也是可以
//object虽然万能,但是有个装箱操作,或者用其他方法优化他
//以前写的一个优化object的方法:https://www.cnblogs.com/sanyejun/p/9564320.html
Task<object> MyTestTask()
{
C_SendMsg();//发送方法
TaskCompletionSource<object> tcs;
tcs = new TaskCompletionSource<object>();
Debug.Log("消息发送完毕");
//给对应的加入回调
requestCallback["C_response"] = (data) =>
{
print("异步结束");
tcs.SetResult(data);//给返回值赋值,这里面的data类型取决于前面 Task<类型>
}; return tcs.Task;
} /*******************模拟客户端******************/
void C_SendMsg()
{
print("客户端发送消息");
S_ServerMethod();
} //RPC
void C_response(object data)
{
Debug.Log("收到了来自服务器的消息");
requestCallback["C_response"](data);
} /****************模拟服务器***************/
void S_ServerMethod()
{
print("服务端接收到了消息");
//模拟网络发送慢的等待时间3秒
Invoke("S_SendMSG", );
} void S_SendMSG()
{
C_response();
}
}

结果

c# 实现RPC框架的思路的更多相关文章

  1. RPC框架设计思路

    RPC是指远程过程调用 1.要解决通讯的问题,主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输.连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远 ...

  2. RPC框架实现思路浅析

    第一部分,设计分析 远程调用要解决的主要问题: 1,序列化 : 如何将对象转化为二进制数据进行传输,如何将二进制数据转化对象 2,数据的传输(协议,第三方框架) 3,服务的注册/发现,单点故障,分布式 ...

  3. 8.如何自己设计一个类似 Dubbo 的 RPC 框架?

    作者:中华石杉 面试题 如何自己设计一个类似 Dubbo 的 RPC 框架? 面试官心理分析 说实话,就这问题,其实就跟问你如何自己设计一个 MQ 一样的道理,就考两个: 你有没有对某个 rpc 框架 ...

  4. 全图文分析:如何利用Google的protobuf,来思考、设计、实现自己的RPC框架

    目录 一.前言 二.RPC 基础概念 1. RPC 是什么? 2. 需要解决什么问题? 3. 有哪些开源实现? 三.protobuf 基本使用 1. 基本知识 2. 使用步骤 四.libevent 1 ...

  5. rpc框架之 thrift连接池实现

    接前一篇rpc框架之HA/负载均衡构架设计 继续,写了一个简单的thrift 连接池: 先做点准备工作: package yjmyzz; public class ServerInfo { publi ...

  6. rpc框架之HA/负载均衡构架设计

    thrift.avro.grpc之类的rpc框架默认都没有提供负载均衡的实现,生产环境中如果server只有一台,显然不靠谱,于是有了下面的设计,这其实是前一阵跟北京一个朋友在qq群里交流的结果,分享 ...

  7. rpc框架之 thrift 学习 1 - 安装 及 hello world

    thrift是一个facebook开源的高效RPC框架,其主要特点是跨语言及二进制高效传输(当然,除了二进制,也支持json等常用序列化机制),官网地址:http://thrift.apache.or ...

  8. .net RPC框架选型

    近期开始研究分布式架构,会涉及到一个最核心的组件:RPC(Remote Procedure Call Protocol).这个东西的稳定性与性能,直接决定了分布式架构系统的好坏.RPC技术,我们的产品 ...

  9. .net RPC框架选型(一)

    近期开始研究分布式架构,会涉及到一个最核心的组件:RPC(Remote Procedure Call Protocol).这个东西的稳定性与性能,直接决定了分布式架构系统的好坏.RPC技术,我们的产品 ...

随机推荐

  1. Apache Shiro 10分钟之旅!

    欢迎来到Apache Shiro 10分钟之旅! 希望通过这个简单.快速的示例,可以让你对应用程序中使用Shiro有个深入的了解.嗯,10分钟你应该可以搞定它. 概述 Apache Shiro是什么? ...

  2. tcxgrid控件中drag a column header here to group by that column移除方法

  3. chrome console cheat sheet

    快捷键 打开console界面快捷键:ctrl+shift+J 清空log:ctrl+L 选项 Log XMLHTTPRequests:显示ajax Preserve log upon navigat ...

  4. Oracle定時email通知

    small_program_task 這張表的資料是待發送的email通知,再次之前已經有一個job會定時掃描固定時間內未接收到小程式回報狀態將其寫入到該表,send_flag為N,表示為寄過通知.e ...

  5. Spring学习(一)——环境准备

            以前做的项目都是用.net开发的,以后准备迁移到java平台上,近期正好有个新项目要上马,所以调研下java相关技术.Spring作为java平台下的一个全栈框架, 其简洁优雅的设计和 ...

  6. Windows上编译libpng

    下载libpng 1.5.10并解压到[工作目录]/png/libpng-1.5.10 用CMake选择png/libpng-1.5.10目录并Configure: CMAKE_C_FLAGS_DEB ...

  7. 【OCP-052】新版052最新题库及答案整理-第14题

    14.Which command is used to display files that no longer conform to the backup retention policy? A) ...

  8. 【bzoj4888】: [Tjoi2017]异或和 BIT-乱搞

    [bzoj4888]: [Tjoi2017]异或和 题目大意:给定一个序列,求这个序列所有的连续和的异或值.(n<=1e5 ai<=1e6) 想了各种奇怪的方法就是不会做啊啊啊.. Orz ...

  9. Postman使用手册4——API test

    一.Pre Request Scripts Postman v0.10+ 版本支持pre-request scripts. prerequest script.png pre-request scri ...

  10. 基本bash shell命令

    以下列举一些常用的bash shell命令,在使用时方便查找. 访问Linux系统上的手册:man 命令.例:man ps      手册是由分页程序来显示的,可以通过点击 空格,回车,向上和向下箭头 ...