/// <summary>
        ///  This MUST be an asynchronous call
        /// </summary>
        private void SendTrackerGet()
        {
            PrepareTrackerRequest();
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(trackerGetRequest);
            requestState = new RequestState();
            // To store the request
            requestState.request = request;
            try {
                // Start the Async request
                IAsyncResult result = request.BeginGetResponse(new AsyncCallback(EndGetTrackerResponse), requestState);

                // We need a TimeOut
                ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle, new WaitOrTimerCallback(TrackerGetTimeOut), requestState, requestTimeOut, true);

                // Signal the manual event to wait.
                allDone.WaitOne();
                requestState.response.Close();
                trackerResponse = null;
                trackerFailure = false;
                trackerFailureReason = string.Empty;
            }
            catch(WebException we) {
                throw new TrackerException("Error in GET to tracker. [" + we.Message + "].", we);
            }
        }
        private void EndGetTrackerResponse(IAsyncResult result)
        {
            requestState = (RequestState) result.AsyncState;
            try {
                WebRequest webRequest = requestState.request;
                requestState.response = webRequest.EndGetResponse(result);

                // Get the response
                requestState.streamResponse = requestState.response.GetResponseStream();

                Encoding encode = System.Text.Encoding.GetEncoding("utf-8");
                StreamReader sr = new StreamReader(requestState.streamResponse, encode);
                // Tracker response must have less than 256 bytes.
                char[] bufferRead = new char[512];
                int responseLength = sr.Read(bufferRead, 0, 512);
                trackerResponse = new byte[responseLength];
                for (int i = 0; i < responseLength; i++) {
                    trackerResponse[i] = (byte)bufferRead[i];
                }
                ProcessTrackerResponse();
            }
            catch (WebException we) {
                throw new TrackerException("Error getting response from tracker. [" + we.Message + "].", we);
            }
            allDone.Set();
        }