/// <summary> /// Thread function where the query is actually executed. The call to Receive() is blocking and the /// separate timer thread takes care of the timeout behaviour (if specified) /// </summary> private void QueryThreadProc(object oQueryState) { UDPServerQueryState queryState = (UDPServerQueryState)oQueryState; try { // Send the query to the server OutboundPacket query = new OutboundPacket(true); query.Append((byte)queryState.QueryType); Send(queryState.QueryClient, query); // Wait for a response from the server UDPPacket queryResponse = Receive(queryState.QueryClient); // Stop the timeout timer queryState.End(); if (queryState.QueryResponse == UDPServerQueryResponse.None) { queryState.QueryResponse = UDPServerQueryResponse.Success; OnQueryFinished(queryState, queryResponse); } } catch (ThreadAbortException) { } catch (Exception) { if (queryState.QueryResponse != UDPServerQueryResponse.Timeout) { queryState.QueryResponse = UDPServerQueryResponse.Error; // Stop the timeout timer queryState.End(); OnQueryFinished(queryState, null); } } lock (activeQueryLock) { activeQueries.Remove(queryState); } }
/// <summary> /// Callback function for when the timeout timer expires /// </summary> /// <param name="state"></param> private void QueryTimeoutCallback(object state) { UDPServerQueryState queryState = (UDPServerQueryState)state; // Flag the timeout condition queryState.QueryResponse = UDPServerQueryResponse.Timeout; queryState.End(); OnQueryFinished(queryState, null); lock (activeQueryLock) { activeQueries.Remove(queryState); } }