/// <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); }
// ctor. public ResponseAwaiter(RequestMethodMeta requestToSend) { Request = requestToSend; }