开发人员是如何解决 PC 端程序多开问题的
2025-11-08 12:21:42
如果创建获得成功,则用WaitForClientConnectionsAsync 到时第 2 个运用于范例开展通往
如果创建最终,则用SendSecondInstanceArgsAsync 向第 1 个运用于范例邮寄数据资料
取名渠道在渠道服务器尾端和一个或多个渠道会话之间包括某种程度共享内存。取名渠道可以是单向的,也可以是双向的。它们赞成基于消息的通信,并允许多个会话用到相异的渠道名称同时通往到服务器尾端某种程度。
详尽用到说明了,请参阅官方文件格式《用到取名渠道开展网路某种程度共享内存》 [1]
充分利用2
下面,我们用操作员流程开展演示,如何充分利用单个范例运用于流程:
conststringpipeName = "MyIO"; constPipeOptions NamedPipeOptions = PipeOptions.Asynchronous | PipeOptions.CurrentUserOnly;staticasyncTask Main( string[] args ) {try{using( varpipeServer = newNamedPipeServerStream( pipeName: pipeName,direction: PipeDirection.In,maxNumberOfServerInstances: 1, transmissionMode: PipeTransmissionMode.Byte,options: NamedPipeOptions)){WaitForClientConnectionsAsync(pipeServer,str => Console.WriteLine(str));
Console.WriteLine( $"start server {args[ 0]} " ); Console.ReadKey;}}catch{awaitSendSecondInstanceArgsAsync(=> $"call from {args[ 0]} " ).ConfigureAwait( false); }}
需要注意的是,WaitForClientConnectionsAsync 不能赞await ,否则近期校对器不能分派。
▌WaitForClientConnectionsAsync工具充分利用
充分利用校对器如下:
private static async Task WaitForClientConnectionsAsync(NamedPipeServerStream pipeServer, Action callback){CancellationTokenSource cancellationTokenSource = new CancellationTokenSource;while (true){await pipeServer.WaitForConnectionAsync(cancellationTokenSource.Token).ConfigureAwait(false);try{const int bufferLength = 1024;var buffer = new byte[bufferLength];using (var stream = new MemoryStream){while (true){var bytesRead = await pipeServer.ReadAsync(buffer.AsMemory(0, bufferLength), cancellationTokenSource.Token).ConfigureAwait(false);if (bytesRead == 0){break;}stream.Write(buffer, 0, bytesRead);}
stream.Seek(0, SeekOrigin.Begin);
callback(Encoding.UTF8.GetString(stream.ToArray));}}finally{pipeServer.Disconnect;}}}
尿素到时会话通往
载入会话邮寄的数据资料,转换成表达式
呼叫callback 处理表达式,这里是str => Console.WriteLine(str)
断开会话通往
▌SendSecondInstanceArgsAsync工具充分利用
充分利用校对器如下:
private static async Task SendSecondInstanceArgsAsync(Func func){using (var pipeClient = new NamedPipeClientStream(serverName: ".",pipeName: pipeName,direction: PipeDirection.Out,options: NamedPipeOptions)){CancellationTokenSource cancellationTokenSource2 = new CancellationTokenSource;cancellationTokenSource2.CancelAfter(2500);await pipeClient.ConnectAsync(cancellationTokenSource2.Token).ConfigureAwait(false);
await pipeClient.WriteAsync(Encoding.UTF8.GetBytes(func), cancellationTokenSource2.Token).ConfigureAwait(false);}}
创建会话通往本地渠道服务
向服务尾端邮寄 func 造成了的数据资料,这里是 => $"call from {args[0]}"Demo
创建多开脚本:
start " " "ConsoleApp1.exe" firstInstancestart " " "ConsoleApp1.exe" secondInstance
start " " "ConsoleApp1.exe" thirdInstance
分派后,我们发现流程只能打开一次。并且收到了其它多开运用于发过来的数据资料:
参考资料
[1]《用到取名渠道开展网路某种程度共享内存》:
_id=DT-MVP-38491
微软公司最历史性科学家(MVP)
微软公司最历史性科学家是微软公司公司授予第三方高效率专业人士的一个全球奖项。29年来,世界各地的高效率活动中心领导者,因其在线上和线下的高效率活动中心当中共享专业知识和经验而获得此奖项。
MVP是经过严格挑选的科学家他的团队,他们都有着高效率最精湛且最具特质的人,是对活动中心投入极大的热情并乐于助人的科学家。MVP作出贡献通过演讲、论坛问答、创建网站、撰写博客、共享视频、开源新项目、组织会议等模式来试图他人,并最小程度地试图微软公司高效率活动中心客户尾端用到 Microsoft 高效率。
更多参见暂定官方网站:
用到取名渠道开展网路某种程度共享内存
。帕金森怎么治武汉看男科去哪看
青岛看妇科去哪家医院最好
重庆哪的妇科医院好
补气血的补品什么最好

-
赣州盆地见到最完整鸭嘴龙胚胎,距今七千万年
蜥脚类小猪还在蛋黄里扎根的时候,是什么样的?最近,之中外蜥脚类倡议宣布挖掘出了为数不多物理记录的最明晰的蜥脚类类胚胎发育“英小妹”。这枚之中石器时代平均7200万至6600万年的蜥脚类蛋黄,将对
2025-11-08 00:21:42

-
《光环》《斗罗大陆:魂师游对决》背后的3D优化新技术
展到,降低复杂性的同时,解决问题超大规模状况CGI,必需小游戏在不同的平台上都能以最终目标帧率顺畅试运行,降低了对客户端硬件的设备的放宽,进而为非常服务器端个体订制非常为夸张的小游戏真实感。
2025-11-08 00:21:42

-
开发人员是如何解决 PC 端程序多开问题的
尾端流程多开关键问题的核心充分利用物理现象如下: 创建一个 NamedPipeServerStream 取名渠道服务器尾端范例 如果创建获得成功,则用WaitForClie
2025-11-08 00:21:42

-
一“枪”搞定?英公司模仿枪虾攻击时的声波,实现了核聚变突破
p来使 First Light 独特的扫描关键技术,增殖燃煤的坍缩反应速度将多达 70 公里秒,激发的受压是星球压强的 30 倍。此时,燃煤成为星球上移动反应速度最快的物体,燃煤薄膜从几毫米缓冲器
2025-11-08 00:21:42

-
Datafocus Cloud上架亚马逊云市场,加速领跑智能搜索样式BI产品赛道
恰好的期望,DataFocus一个团队将争得更加出彩的进步,承接出更加最出色的计算机系统BI产品线,引领国际欧美国家BI市场迸发更加多活力与生命力。。a href="http:w
2025-11-08 00:21:42