我在网上找了一个 异步类 
用BeginGetResponse和BeginRead 来异步读数据然后我在成功完成后和 异常时候都触发一个事件但是现在发现我调用这个类的时候, 多次引发事件. 怎样才能保证发生错误后 只会引发一个错误事件?代码如下using System;
using System.Net;
using System.IO;
using System.Text;
using System.Threading;//http://api.map.baidu.com/geocoder?output=json&location=xxxxxx,xxxxxx&key=37492c0ee6f924cb5e934fa08c6b1676
//URLEncoder.encode
namespace ManagerServer
{    public class HttpWebRequest_BeginGetResponse
    {        public class RequestState
        {
            //   This   class   stores   the   State   of   the   request.
            const int BUFFER_SIZE = 1024;
            public System.Text.Encoder CharacterSet;
            public StringBuilder requestData;
            public byte[] BufferRead;
            public HttpWebRequest request;
            public HttpWebResponse response;
            public Stream streamResponse;
            public RequestState()
            {
                BufferRead = new byte[BUFFER_SIZE];
                requestData = new StringBuilder(" ");
                request = null;
                streamResponse = null;
            }
        }        public static ManualResetEvent allDone = new ManualResetEvent(false);
        const int BUFFER_SIZE = 1024;
        const int DefaultTimeout = 2 * 60 * 1000;   //   2   minutes   timeout    
        public delegate void ReadOverHandler(StringBuilder requestData, object exobject);
        //public delegate void ReadOverHandler(StringBuilder requestData,int smstype);
        public event ReadOverHandler ReadOver;
        public object smstype = 0;        public HttpWebRequest_BeginGetResponse()
        {        }        //   Abort   the   request   if   the   timer   fires.
        private void TimeoutCallback(object state, bool timedOut)
        {
            if (timedOut)
            {
                HttpWebRequest request = state as HttpWebRequest;
                if (request != null)
                {
                    request.Abort();
                }
            }
        }        public void GetData(string Url)
        {
            bool isok = true;
            try
            {
                //   Create   a   HttpWebrequest   object   to   the   desired   URL.                  HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(Url);
                /**
                    *   If   you   are   behind   a   firewall   and   you   do   not   have   your   browser   proxy   setup
                    *   you   need   to   use   the   following   proxy   creation   code.                        //   Create   a   proxy   object.
                        WebProxy   myProxy   =   new   WebProxy();                        //   Associate   a   new   Uri   object   to   the   _wProxy   object,   using   the   proxy   address
                        //   selected   by   the   user.
                        myProxy.Address   =   new   Uri( "http://myproxy ");
             
               
                        //   Finally,   initialize   the   Web   request   object   proxy   property   with   the   _wProxy
                        //   object.
                        myHttpWebRequest.Proxy=myProxy;
                    ***/                //   Create   an   instance   of   the   RequestState   and   assign   the   previous   myHttpWebRequest
                //   object   to   it 's   request   field.    
                RequestState myRequestState = new RequestState();
                myRequestState.request = myHttpWebRequest;
                //   Start   the   asynchronous   request.
                IAsyncResult result =
                    (IAsyncResult)myHttpWebRequest.BeginGetResponse(new AsyncCallback(RespCallback), myRequestState);                //   this   line   impliments   the   timeout,   if   there   is   a   timeout,   the   callback   fires   and   the   request   becomes   aborted
                ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle, new WaitOrTimerCallback(TimeoutCallback), myHttpWebRequest, DefaultTimeout, true);                //   The   response   came   in   the   allowed   time.   The   work   processing   will   happen   in   the  
                //   callback   function.
                allDone.WaitOne();                //   Release   the   HttpWebResponse   resource.
                myRequestState.response.Close();
            }
            //catch (WebException e)
            //{
            //    //Console.WriteLine("\nMain   Exception   raised! ");
            //    //Console.WriteLine("\nMessage:{0} ", e.Message);
            //    //Console.WriteLine("\nStatus:{0} ", e.Status);
            //    //Console.WriteLine("Press   any   key   to   continue.......... ");
            //    //触发事件
            //    isok = false;
              
            //}
            catch (Exception e)
            {
                //Console.WriteLine("\nMain   Exception   raised! ");
                //Console.WriteLine("Source   :{0}   ", e.Source);
                //Console.WriteLine("Message   :{0}   ", e.Message);
                //Console.WriteLine("Press   any   key   to   continue.......... ");
                //Console.Read();
                //触发事件
            
                isok = false;
            }
          
            if (!isok)
            {
                ReadOver(new StringBuilder(""), smstype);
            }
          
        }
        private void RespCallback(IAsyncResult asynchronousResult)
        {           
            try
            {
                //   State   of   request   is   asynchronous.
                RequestState myRequestState = (RequestState)asynchronousResult.AsyncState;
                HttpWebRequest myHttpWebRequest = myRequestState.request;
                myRequestState.response = (HttpWebResponse)myHttpWebRequest.EndGetResponse(asynchronousResult);                //   Read   the   response   into   a   Stream   object.
                Stream responseStream = myRequestState.response.GetResponseStream();
                myRequestState.streamResponse = responseStream;                //   Begin   the   Reading   of   the   contents   of   the   HTML   page   and   print   it   to   the   console.
                IAsyncResult asynchronousInputRead = responseStream.BeginRead(myRequestState.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), myRequestState);
                return;
            }
            catch (WebException e)
            {
                //Console.WriteLine("\nRespCallback   Exception   raised! ");
                //Console.WriteLine("\nMessage:{0} ", e.Message);
                //Console.WriteLine("\nStatus:{0} ", e.Status);
                //触发事件
                if (ReadOver != null)
                {
                    ReadOver(new StringBuilder(""), smstype);
                } 
            }
            allDone.Set();
        }
        private void ReadCallBack(IAsyncResult asyncResult)
        {
            try
            {                RequestState myRequestState = (RequestState)asyncResult.AsyncState;
                Stream responseStream = myRequestState.streamResponse;
                int read = responseStream.EndRead(asyncResult);
                //   Read   the   HTML   page   and   then   print   it   to   the   console.
                if (read > 0)
                {                    myRequestState.requestData.Append(Encoding.UTF8.GetString(myRequestState.BufferRead, 0, read));                    IAsyncResult asynchronousResult = responseStream.BeginRead(myRequestState.BufferRead, 0, BUFFER_SIZE, new AsyncCallback(ReadCallBack), myRequestState);
                    return;
                }
                else
                {
                    //Console.WriteLine("\nThe   contents   of   the   Html   page   are   :   ");
                   
                    //触发事件
                    if (ReadOver != null)
                    {
                        ReadOver(myRequestState.requestData, smstype);
                    }                    responseStream.Close();
                }            }
            catch (WebException e)
            {
                //Console.WriteLine("\nReadCallBack   Exception   raised! ");
                //Console.WriteLine("\nMessage:{0} ", e.Message);
                //Console.WriteLine("\nStatus:{0} ", e.Status);
                //  //触发事件
                if (ReadOver != null)
                {
                    ReadOver(new StringBuilder(""), smstype);
                }
            }
            allDone.Set();        }
    }
}