Beispiel #1
0
        public async Task <T> RemoteCall <T>(string identifier, params object[] param)
        {
            if (UseCallbacks)
            {
                var CallbackGuid = Guid.NewGuid().ToString();

                Callbacks.TryAdd(CallbackGuid, new TiedEventWait());

                var Event = new NetworkEvent(NetworkHeader.HEADER_MOVE, CallbackGuid, identifier, param);

                if (!await ClientSocket.BlockingSend(Event))
                {
                    throw new Exception("Failed to sent request to server!");
                }

                Callbacks[CallbackGuid].Event.WaitOne();

                var Result = Callbacks[CallbackGuid].Result;

                Callbacks.TryRemove(CallbackGuid, out _);

                return((T)Result.Data);
            }
            else
            {
                await CallSem.WaitAsync();

                var Event = new NetworkEvent(NetworkHeader.HEADER_MOVE, identifier, param);

                if (!await ClientSocket.BlockingSend(Event))
                {
                    throw new Exception("Failed to sent request to server!");
                }

                NetworkEvent Result;

                if ((Result = await ClientSocket.BlockingReceive()) == default(NetworkEvent))
                {
                    throw new Exception("Failed to receive result from server!");
                }

                if (Result.Header == NetworkHeader.HEADER_ERROR)
                {
                    throw new Exception("An exception was caused on the server!");
                }
                else if (Result.Header != NetworkHeader.HEADER_RETURN)
                {
                    throw new Exception("Unexpected error");
                }

                CallSem.Release();

                return((T)Result.Data);
            }
        }