Exemplo n.º 1
0
        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();
                    }
                }
            }
        }
Exemplo n.º 2
0
        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);
        }