c# 实现RPC框架的思路

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", 3);
    }

    void S_SendMSG()
    {
        C_response(998);
    }
}
复制代码

结果

 

posted @   三页菌  阅读(1741)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
历史上的今天:
2017-12-19 动态替换animator的研究
2017-12-19 unity规范
2017-12-19 游戏源码--Unity开源Moba游戏-服务器-客户端完整V1.0
点击右上角即可分享
微信分享提示