コード例 #1
0
        private async Task ReadDnsDatagramAsync()
        {
            try
            {
                while (true)
                {
                    //read response datagram
                    DnsDatagram response = await DnsDatagram.ReadFromTcpAsync(_tcpStream, _recvBuffer).WithTimeout(ASYNC_RECEIVE_TIMEOUT);

                    //signal waiting thread of response
                    if (_transactions.TryGetValue(response.Identifier, out Transaction transaction))
                    {
                        transaction.Stopwatch.Stop();

                        response.SetMetadata(new DnsDatagramMetadata(_server, _protocol, response.Size, transaction.Stopwatch.Elapsed.TotalMilliseconds));

                        transaction.ResponseTask.TrySetResult(response);
                    }
                }
            }
            catch (Exception ex)
            {
                await _sendRequestSemaphore.WaitAsync();

                try
                {
                    if (_tcpStream != null)
                    {
                        _tcpStream.Dispose();
                        _tcpStream = null;
                    }

                    foreach (Transaction transaction in _transactions.Values)
                    {
                        transaction.Stopwatch.Stop();
                        transaction.ResponseTask.SetException(ex);
                    }

                    _transactions.Clear();
                }
                finally
                {
                    _sendRequestSemaphore.Release();
                }
            }
        }
コード例 #2
0
        private async Task ReadDnsDatagramAsync()
        {
            try
            {
                while (true)
                {
                    //read response datagram
                    DnsDatagram response = await DnsDatagram.ReadFromTcpAsync(_tcpStream, _recvBuffer).WithTimeout(ASYNC_RECEIVE_TIMEOUT);

                    //signal response
                    if (_transactions.TryGetValue(response.Identifier, out Transaction transaction))
                    {
                        transaction.SetResponse(response, _server, _protocol);
                    }
                }
            }
            catch (Exception ex)
            {
                await _sendRequestSemaphore.WaitAsync();

                try
                {
                    if (_tcpStream != null)
                    {
                        _tcpStream.Dispose();
                        _tcpStream = null;
                    }

                    foreach (KeyValuePair <ushort, Transaction> transaction in _transactions)
                    {
                        transaction.Value.SetException(ex);
                    }

                    _transactions.Clear();
                }
                finally
                {
                    _sendRequestSemaphore.Release();
                }
            }
        }