public override async Task <PipeEndpoint> Connect(int index, CancellationToken cancel = default(CancellationToken)) { object connecting_key = new object(); connecting.Add(Tuple.Create(index, connecting_key)); int rindex = -1; try { MessageEntry m = new MessageEntry(MessageEntryType.PipeConnectReq, MemberName); m.AddElement("index", index); MessageEntry ret = await stub.ProcessRequest(m, cancel); rindex = (ret.FindElement("index").CastData <int[]>())[0]; PipeEndpoint e; if (early_endpoints.ContainsKey(rindex)) { e = early_endpoints[rindex]; early_endpoints.Remove(rindex); } else { e = new PipeEndpoint(this, rindex); } pipeendpoints.Add(rindex, e); return(e); } finally { connecting.RemoveAll(x => Object.ReferenceEquals(x.Item2, connecting_key)); if (connecting.Count == 0) { early_endpoints.Clear(); } } }
public async override Task <WireConnection> Connect(CancellationToken cancel = default(CancellationToken)) { try { lock (connect_lock) { if (connection != null) { throw new InvalidOperationException("Already connected"); } connection = new WireConnection(this); } MessageEntry m = new MessageEntry(MessageEntryType.WireConnectReq, MemberName); MessageEntry ret = await stub.ProcessRequest(m, cancel); return(connection); } catch (Exception e) { connection = null; throw e; } }