Example #1
0
        private async Task <LIFXProtocolPacket> SendReceiveAsync(UInt32 source, string hostName, LIFXProtocolPacket packet, int timeout = 30000)
        {
            try
            {
                var tokenSource = new CancellationTokenSource(timeout);
                var token       = tokenSource.Token;

                var tcs            = new TaskCompletionSource <LIFXProtocolPacket>();
                var successfullAdd = _tcsDictionary.TryAdd(source, tcs);
                if (!successfullAdd)
                {
                    throw new Exception($"Failed to add {source} to dictionary");
                }

                await _networkClient.SendMessage(hostName, packet);

                var result = await tcs.Task.WithCancellation(token);

                if (_tcsDictionary.ContainsKey(source))
                {
                    TaskCompletionSource <LIFXProtocolPacket> value = null;
                    _tcsDictionary.TryRemove(source, out value);
                }

                return(result);
            }
            finally
            {
                if (_tcsDictionary.ContainsKey(source))
                {
                    TaskCompletionSource <LIFXProtocolPacket> value = null;
                    _tcsDictionary.TryRemove(source, out value);
                }
            }
        }