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(); } } }
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(); } } }