public Sender Get(string entitypath, string viaEntityPath, string namespaceName) { var buffer = MessageReceivers.GetOrAdd(entitypath + viaEntityPath + namespaceName, s => { var b = new CircularBuffer <EntityClientEntry>(numberOfSendersPerEntity); for (var i = 0; i < numberOfSendersPerEntity; i++) { var e = new EntityClientEntry { ClientEntity = receiveFactory(entitypath, viaEntityPath, namespaceName).GetAwaiter() .GetResult() }; b.Put(e); } return(b); }); var entry = buffer.Get(); if (entry.ClientEntity.IsClosed) { lock (entry.Mutex) { if (entry.ClientEntity.IsClosed) { entry.ClientEntity = receiveFactory(entitypath, viaEntityPath, namespaceName).GetAwaiter().GetResult(); } } } return(entry.ClientEntity); }
public async Task <Sender> Get(string entitypath, string viaEntityPath, string namespaceName) { var buffer = await MessageSenders.GetOrAdd(entitypath + viaEntityPath + namespaceName, async s => { var b = new CircularBuffer <EntityClientEntry>(numberOfSendersPerEntity); for (var i = 0; i < numberOfSendersPerEntity; i++) { var e = new EntityClientEntry { ClientEntity = await senderFactory(entitypath, viaEntityPath, namespaceName) .ConfigureAwait(false) }; b.Put(e); } return(b); }).ConfigureAwait(false); var entry = buffer.Get(); if (!entry.ClientEntity.IsClosed) { return(entry.ClientEntity); } try { await entry.Mutex.WaitAsync() .ConfigureAwait(false); if (entry.ClientEntity.IsClosed) { entry.ClientEntity = await senderFactory(entitypath, viaEntityPath, namespaceName) .ConfigureAwait(false); } return(entry.ClientEntity); } finally { entry.Mutex.Release(); } }
public async Task <IMessageReceiverInternal> Get(string entityPath, string namespaceAlias) { var buffer = await MessageReceivers.GetOrAdd(entityPath + namespaceAlias, async s => { var b = new CircularBuffer <EntityClientEntry>(numberOfReceiversPerEntity); for (var i = 0; i < numberOfReceiversPerEntity; i++) { var e = new EntityClientEntry { ClientEntity = await receiveFactory.Create(entityPath, namespaceAlias) .ConfigureAwait(false) }; b.Put(e); } return(b); }).ConfigureAwait(false); var entry = buffer.Get(); if (!entry.ClientEntity.IsClosed) { return(entry.ClientEntity); } try { await entry.Semaphore.WaitAsync() .ConfigureAwait(false); if (entry.ClientEntity.IsClosed) { entry.ClientEntity = await receiveFactory.Create(entityPath, namespaceAlias) .ConfigureAwait(false); } return(entry.ClientEntity); } finally { entry.Semaphore.Release(); } }