Пример #1
0
        /// <summary>
        /// Потокобезопасно добавляет запрос в словарь запросов и возвращает уникальный идентификатор.
        /// </summary>
        /// <exception cref="Exception">Происходит если уже происходил обрыв соединения.</exception>
        public ResponseAwaiter <T> AddRequest <T>(RequestMethodMeta requestToSend, out int uid)
        {
            var responseAwaiter = new ResponseAwaiter <T>(requestToSend);

            do
            {
                lock (_dict)
                {
                    if (_disconnectException == null)
                    {
                        if (_dict.Count < int.MaxValue)
                        // Словарь еще не переполнен — можно найти свободный ключ.
                        {
                            do
                            {
                                uid = IncrementSeq();
                            } while (!_dict.TryAdd(uid, responseAwaiter));
                            return(responseAwaiter);
                        }
                    }
                    else
                    {
                        ThrowHelper.ThrowException(_disconnectException);
                    }

                    // Словарь переполнен — подождать и повторить попытку.
                    _spinWait.SpinOnce();
                }
            } while (true);
        }
        /// <exception cref="VRpcException"/>
        public Task <TResult> CallAsync <TResult>(string controllerName, string actionName, params object[] args)
        {
            var            requestMeta = new RequestMethodMeta(controllerName, actionName, typeof(TResult), false);
            Task <TResult> requestTask = SendRequestAndWaitResponse <TResult>(requestMeta, args);

            return(requestTask);
        }
        /// <exception cref="VRpcException"/>
        public void Call(string controllerName, string actionName, params object[] args)
        {
            var requestMeta = new RequestMethodMeta(controllerName, actionName, typeof(VoidStruct), false);
            Task <VoidStruct> requestTask = SendRequestAndWaitResponse <VoidStruct>(requestMeta, args);

            requestTask.GetAwaiter().GetResult();
        }
        public TResult Call <TResult>(string controllerName, string actionName, params object[] args)
        {
            var requestMeta = new RequestMethodMeta(controllerName, actionName, typeof(TResult), false);

            Task <TResult> requestTask = SendRequestAndWaitResponse <TResult>(requestMeta, args);
            TResult        result      = requestTask.GetAwaiter().GetResult();

            return(result);
        }
Пример #5
0
 // ctor.
 public ResponseAwaiter(RequestMethodMeta requestToSend)
 {
     Request = requestToSend;
 }