private void Action <TArgument>(AmoebaRequestType type, TArgument argument, CancellationToken token) { var(id, queue) = this.Send(type, argument); using (var register = token.Register(() => this.Cancel(id))) { ResponseInfo info = null; try { info = queue.Dequeue(); if (info.Type == AmoebaResponseType.Result) { return; } else if (info.Type == AmoebaResponseType.Error) { throw new AmoebaInterfaceManagerException(JsonUtils.Load <string>(info.Stream)); } throw new NotSupportedException(); } finally { queue.Dispose(); _queueMap.Remove(id); if (info != null) { info.Stream.Dispose(); } } } }
private (int, WaitQueue <ResponseInfo>) Send <TArgument>(AmoebaRequestType type, TArgument argument) { int id = this.CreateId(); var queue = new WaitQueue <ResponseInfo>(); _queueMap.Add(id, queue); using (var writer = new ItemStreamWriter(_bufferManager)) { writer.Write((uint)type); writer.Write((uint)id); Stream valueStream = null; if (argument != null) { try { valueStream = new BufferStream(_bufferManager); JsonUtils.Save(valueStream, argument); } catch (Exception) { if (valueStream != null) { valueStream.Dispose(); valueStream = null; } throw; } } _messagingManager.Send(new UniteStream(writer.GetStream(), valueStream)); } return(id, queue); }