首页 > 其他分享 >用 TaskCompletionSource 来做多线程间的数据同步

用 TaskCompletionSource 来做多线程间的数据同步

时间:2023-08-16 16:12:09浏览次数:32  
标签:break 同步 methodName await paraments SendAsync HubConnection TaskCompletionSource

 public abstract class HunClientBase
    {
        protected ComunicationConfig _ComunicationConfig;
        protected HubConnection _HubConnection;
        private TaskCompletionSource<string> requestCompletionSource;
        protected HunClientBase(string route) 
        {
            _ComunicationConfig = AppSettings.GetValue<ComunicationConfig>("ComunicationConfig");
            if (_ComunicationConfig is null || string.IsNullOrWhiteSpace(_ComunicationConfig.SignalRUrl)) 
                throw new ArgumentNullException("HunClientBase 未读取 SignalRUrl");

            _HubConnection = new HubConnectionBuilder()
                .WithUrl($"{_ComunicationConfig.SignalRUrl.TrimEnd('/')}/{route}")
                .WithAutomaticReconnect()
                .Build();

            _HubConnection.On<string>("ClientHubReceive", ClientHubReceive);
        }
        /// <summary>
        /// SignalR 请求,并等待回复
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="methodName"></param>
        /// <param name="paraments"></param>
        /// <returns>json</returns>
        public async Task<string> SignalRequestAsync(string methodName,params object[]? paraments)
        {
        if (_HubConnection.State == HubConnectionState.Disconnected)
        {
            await _HubConnection.StartAsync();
        }
            try
            {
                switch (paraments?.Length)
                {
                    case 1:
                        await _HubConnection.SendAsync(methodName,  paraments[0]);
                        break;
                    case 2:
                        await _HubConnection.SendAsync(methodName,  paraments[0], paraments[1]);
                        break;
                    case 3:
                        await _HubConnection.SendAsync(methodName,  paraments[0], paraments[1], paraments[2]);
                        break;
                    case 4:
                        await _HubConnection.SendAsync(methodName,  paraments[0], paraments[1], paraments[2], paraments[3]);
                        break;
                    case 5:
                        await _HubConnection.SendAsync(methodName,  paraments[0], paraments[1], paraments[2], paraments[3], paraments[4]);
                        break;
                    case 6:
                        await _HubConnection.SendAsync(methodName,  paraments[0], paraments[1], paraments[2], paraments[3], paraments[4], paraments[5]);
                        break;
                    default:
                        await _HubConnection.SendAsync(methodName);
                        break;
                }
                requestCompletionSource = new TaskCompletionSource<string>();
                return await requestCompletionSource.Task;
            }
            catch (Exception ex)
            {
                throw;
            }
        }
        protected void ClientHubReceive(string json)
        {
        requestCompletionSource.TrySetResult(json);
        }
    }

这是一个SignalR客户端,提交数据,和回调数据是异步的,你没法知道什么时候回调函数被执行;所以要在提交数据的函数 SignalRequestAsync 里返回服务端的回调数据就可以用到 TaskCompletionSource;

标签:break,同步,methodName,await,paraments,SendAsync,HubConnection,TaskCompletionSource
From: https://www.cnblogs.com/cchong005/p/17635373.html

相关文章

  • Java并发编程:实现高效、线程安全的多线程应用
    Java并发编程是开发高效、可扩展的多线程应用的关键。合理地利用多线程可以提高程序的性能和响应性,但同时也会引入线程安全的问题。本文将介绍Java并发编程的关键技巧,帮助读者实现高效、线程安全的多线程应用。 线程安全的数据结构和类Java提供了许多线程安全的数据结构和类,如Co......
  • Obsidian多端同步,无需插件
    官方同步方案(付费)开通链接在:账户,具体方法参考官方文档:Obsidian同步服务byob官方。优点:省心易用稳定。缺点:贵,10美元/月,年付8美元/月(教育认证打六折,详见第一个链接)。打折渠道:教育认证:六折,详见第一个链接;拼团:购买官方同步服务后,一个账号可以创建5个仓库,可以5个人共用一个账......
  • 自动同步 github 仓库到 gitee
    自动同步github仓库到gitee先上最终效果代码仓库:github2giteeGithubAction同步结果:为什么要同步到gitee将gitee仓库作为备份镜像仓库,以防不测网上的同步方法大致在网上查找了一通,基本都是使用githubaction做到自动同步,也有一些前人封装好的action,所以做起来......
  • Rsync实时同步工具
    一、rsync是什么rsync(remotesynchronize)是Liunx/Unix下的一个远程数据同步工具。它可通过LAN/WAN快速同步多台主机间的文件和目录,并适当利用rsync算法(差分编码)以减少数据的传输。rsync算法并不是每一次都整份传输,而是只传输两个文件的不同部分,因此其传输速度相当快。除此......
  • 什么是多线程中的上下文切换
    多线程中的上下文切换(ContextSwitching)是指在多任务(多线程)环境下,操作系统将当前线程的状态保存(上下文信息,如寄存器内容、程序计数器等)并切换到另一个就绪状态的线程的过程。上下文切换是实现多任务并发的基本机制之一,它允许多个线程在一个物理CPU上交替执行,从而实现了多线程并......
  • JS实现播放音乐时歌词同步展示
    效果如下:实现过程:监听音频播放时间,使用歌词的出现时间与其比较,展示对应时间歌词内容,代码如下<audioid="audio-player"src="每个眼神都只身荒野.m4a"controls></audio><divclass="lyrics-container"><divid="lyrics"></div></div&g......
  • 并发与同步
    进程间的作用P、V操作不能实现共享PV操作不足不易读懂不利于修改和维护正确性难以保证可以用于线程tm的进程间的同步同步:一个进程在等待另一个进程给它发送消息一组并发进程因直接制约而互相发送消息、进行互相合作、互相等待,使得各进程按一定速度执行的过程称为进程间的同步 进......
  • Java并发编程:实现高效、线程安全的多线程应用
    Java并发编程是开发高效、可扩展的多线程应用的关键。合理地利用多线程可以提高程序的性能和响应性,但同时也会引入线程安全的问题。本文将介绍Java并发编程的关键技巧,帮助读者实现高效、线程安全的多线程应用。 线程安全的数据结构和类Java提供了许多线程安全的数据结构和类,如Co......
  • 中电金信:技术实践|Flink多线程实现异构集群的动态负载均衡
    导语:ApacheFlink是一个框架和分布式处理引擎,用于对无界和有界数据流进行有状态计算。本文主要从实际案例入手并结合作者的实践经验,向各位读者分享当应用场景中异构集群无法做到负载均衡时,如何通过Flink的自定义多线程来实现异构集群的动态负载均衡。●1. 前言●2. 出现的问......
  • 多线程1
    多线程1 8.1基本概念:程序、进程、线程程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。进程(process)是程序的一次执行过程,或是正在运行的一个程序。是一个动态的过程:有它自身的产生、存在和消亡的过程。——生命周期......