我在网上找了一个 异步类
用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(); }
}
}
用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(); }
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货