Skip to content

Commit dab6ab1

Browse files
committed
修复线程安全
1 parent 2cc6b91 commit dab6ab1

File tree

2 files changed

+9
-3
lines changed

2 files changed

+9
-3
lines changed

src/dotnetCampus.Ipc/Pipes/IpcClientService.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ public async Task Start(bool shouldRegisterToPeer = true)
121121
/// <returns></returns>
122122
internal Task<bool> TryConnectToExistingPeerAsync()
123123
{
124-
return StartInternalAsync(isReConnect: false, shouldRegisterToPeer: true, onlyConnectToExistingPeer: true);
124+
return StartInternalAsync(isReConnect: false, shouldRegisterToPeer: false, onlyConnectToExistingPeer: true);
125125
}
126126

127127
/// <inheritdoc cref="Start"/>
@@ -175,7 +175,7 @@ internal async Task<bool> StartInternalAsync(bool isReConnect, bool shouldRegist
175175
if (shouldRegisterToPeer)
176176
{
177177
// 启动之后,向对方注册,此时对方是服务器
178-
await RegisterToPeer();
178+
await RegisterToPeerAsync();
179179
}
180180

181181
return true;
@@ -293,7 +293,7 @@ void ConnectNamedPipe()
293293
}
294294
}
295295

296-
private async Task RegisterToPeer()
296+
internal async Task RegisterToPeerAsync()
297297
{
298298
Logger.Trace($"[{nameof(IpcClientService)}] StartRegisterToPeer PipeName={IpcContext.PipeName}");
299299

src/dotnetCampus.Ipc/Pipes/IpcProvider.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -346,6 +346,9 @@ public async Task<ConnectToExistingPeerResult> TryConnectToExistingPeerAsync(str
346346

347347
var ipcClientService = CreateIpcClientService(peerName);
348348

349+
// 尝试连接对方
350+
// 连接的时候不会立刻向对方注册自己,只是建立连接关系而已
351+
// 这样是因为一旦向对方注册自己,那对方将会反过来向自己注册。然而此时存在多线程安全问题,此时的 PeerManager 还没加入对方。导致以下代码里面的 PeerManager.WaitForPeerConnectFinishedAsync 无法完成等待,导致单元测试失败
349352
var result = await ipcClientService.TryConnectToExistingPeerAsync().ConfigureAwait(false);
350353
if (!result)
351354
{
@@ -356,6 +359,9 @@ public async Task<ConnectToExistingPeerResult> TryConnectToExistingPeerAsync(str
356359
// 需要确定能连接上对方了,才能加入到 PeerManager 里面。确保不会在下次进来的时候,拿到了一个无法建立连接的 Peer 对象。这里的添加顺序是先确保连接再添加,这就意味着在并行的时候,可能会多次尝试连接。这是符合预期的,本身连接也没有多少损耗,最多只会多创建一个管道而已
357360
peerProxy = new PeerProxy(peerName, ipcClientService, IpcContext);
358361
PeerManager.TryAdd(peerProxy);
362+
363+
// 在 PeerProxy 加入到管理之后,才能向对方注册自己,确保对方收到注册之后,反过来向自己注册时,可以从管理里面拿到注册的对方信息,从而让 PeerManager.WaitForPeerConnectFinishedAsync 能够完成
364+
await ipcClientService.RegisterToPeerAsync();
359365
}
360366

361367
// 等待对方回连,建立双向连接

0 commit comments

Comments
 (0)