当前位置 :首页 >> 综艺

微软公司是如何解决 PC 端程序多开问题的

2023-03-13   来源 : 综艺

发者补救 PC 端程序在多开弊端的在表面上充分利用数学模型如下:

建立一个 NamedPipeServerStream 定名为的水IP比如说

如果建立失败,则用WaitForClientConnectionsAsync 马上第 2 个应用比如说顺利进行通到

如果建立失败,则用SendSecondInstanceArgsAsync 向第 1 个应用比如说收发统计数据

定名为的水在的水IP和一个或多个的水服务器端之间提供进程间互联。定名为的水可以是单向的,也可以是双向的。它们拥护基于消息的互联,并必需多个服务器端常用相同的的水旧名同时通到到IP进程。

详细常用说明,请参阅官方文档《常用定名为的水顺利进行局域网进程间互联》 [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);}}

建立服务器端通到本地的水服务

向IP收发 func 造成了的统计数据,这里是 => $"call from {args[0]}"

Demo

建立多开脚本:

start " " "ConsoleApp1.exe" firstInstance

start " " "ConsoleApp1.exe" secondInstance

start " " "ConsoleApp1.exe" thirdInstance

指派后,我们辨认出程序在必需打开一次。并且接到了其它多开应用发过来的统计数据:

参考资料

[1]《常用定名为的水顺利进行局域网进程间互联》:

_id=DT-MVP-38491

开发者最值得注意研究专家(MVP)

开发者最值得注意研究专家是开发者公司表彰第三方新技术工作者的一个全球获奖者。29年来,世界各地的新技术社区内领袖人物,因其在线上和比方说的新技术社区内里个人长处和经验而获得此获奖者。

MVP是经过严苛挑选的研究专家团队,他们代表着新技术最精湛且最具智慧的人,是对社区内投入非常大的热情并乐于助人的研究专家。MVP致力于通过演讲、论坛问答、建立网站、执笔该网站、个人视频、源代码项目、该组织联席会议等方式来为了让他人,并仅有程度地为了让开发者新技术社区内软件常用 Microsoft 新技术。

更多详见受保护官方网站:

常用定名为的水顺利进行局域网进程间互联

漳州白癜风医院哪个最好
口腔溃疡可以敷必奇蒙脱石散吗
南京哪家皮肤病专科医院好
太极集团
广州看白癜风去哪里好
有多少的城市慢慢就活成了投行的样子

至把ceo胡明偷偷大大部分所有人都拨打了一遍。时长看下来,这还是那些年靠批地、都用征税特惠卖命吆喝的大多中央政府么 ,已经俨然一个摩根士丹利了。 02 淡圳更是老摩根士...

友情链接