public delegate void GetResultEventHandler(object sender, bool IsSucceed, string DataResults);
public event GetResultEventHandler OnGetInfoCompleted;
public void GetPostHtmlResults(string GetURL, int GetTimeOut)
{
HttpWebRequest request = HttpWebRequest.CreateHttp(GetURL);
request.Method = "GET";
request.ContinueTimeout = GetTimeOut;
request.BeginGetResponse(GetInfoCompleted, request);
}
private void GetInfoCompleted(IAsyncResult asyncResult)
{
try
{
HttpWebRequest webRequest = asyncResult.AsyncState as HttpWebRequest;
HttpWebResponse webResponse = (HttpWebResponse)webRequest.EndGetResponse(asyncResult);
Stream streamResult = webResponse.GetResponseStream();
StreamReader reader = new StreamReader(streamResult, Encoding.UTF8);
if (OnGetInfoCompleted != null)
OnGetInfoCompleted(this, true, reader.ReadToEnd());
}
catch (WebException ex)
{
OnGetInfoCompleted(this, false, ex.Message.ToString());
}
}
请问这个异步委托对不对,还有怎样调用它,谢谢!
定义的地方就不说了
你已经定义了
调用的地方也不用说了 你也已经调用了 不过不和规范 一般来说
事件叫做 GetInfoCompleted 调用的方法就应该叫做 OnGetInfoCompleted
不过也无所谓了
你这句话就是调用
if (OnGetInfoCompleted != null)
OnGetInfoCompleted(this, true, reader.ReadToEnd());
}
意思就是 执行GetInfoCompleted 会调用 事件 OnGetInfoCompleted
你这段代码 唯一没有写的位置是 执行部分
执行部分分这么写
假如你这个类叫做 MyClass 事件叫做 OnGetInfoCompleted(保证和你的事件名一样)
而执行部分需要插入的方法叫做 myfunction
那么代码这么写
MyClass myClass = new MyClass();
myClass.OnGetInfoCompleted+=myfunction
myClass.GetInfoCompleted()// 执行这个的时候 会调用 myfunction
这里有一点要提的是 这里你的调用方法是同步的
异步需要用invoke
public class SamWebRequest
{
#region Request
public delegate void GetResultEventHandler(object sender, bool IsSucceed, string DataResults);
public event GetResultEventHandler OnGetInfoCompleted;
public void GetPostHtmlResults(string GetURL, int GetTimeOut)
{
HttpWebRequest request = WebRequest.Create(GetURL) as HttpWebRequest;
request.Method = "GET";
request.Timeout = GetTimeOut;
//request.ContinueTimeout = GetTimeOut;
request.BeginGetResponse(GetInfoCompleted, request);
}
private void GetInfoCompleted(IAsyncResult asyncResult)
{
try
{
HttpWebRequest webRequest = asyncResult.AsyncState as HttpWebRequest;
HttpWebResponse webResponse = (HttpWebResponse)webRequest.EndGetResponse(asyncResult);
Stream streamResult = webResponse.GetResponseStream();
StreamReader reader = new StreamReader(streamResult, Encoding.UTF8);
if (OnGetInfoCompleted != null)
OnGetInfoCompleted(this, true, reader.ReadToEnd());
}
catch (WebException ex)
{
OnGetInfoCompleted(this, false, ex.Message.ToString());
}
}
#endregion
}
-----------------------------------类-----------------------------------
protected void Page_Load(object sender, EventArgs e)
{
Common.SamWebRequest myRequest = new Common.SamWebRequest();
myRequest.OnGetInfoCompleted += myRequest_OnGetInfoCompleted;
myRequest.GetPostHtmlResults("http://www.baidu.com", 500000);
}
void myRequest_OnGetInfoCompleted(object sender, bool IsSucceed, string DataResults)
{
if (IsSucceed)
Response.Write(DataResults);
else
Response.Write(DataResults);
}
调用是这样的,但没执行和输出。。。
@豆汀鱼: 打断点
@小眼睛老鼠:
“System.Web.HttpException”类型的异常在 System.Web.dll 中发生,但未在用户代码中进行处理
其他信息: 响应在此上下文中不可用。
显示这个错误!
@豆汀鱼: 是再哪一行报的错
还有就是 如果是异步的话 request 是没有用的
是同步话 request才有用
不过你这个代码我看起来 像是同步的
@小眼睛老鼠:
Response.Write(DataResults);
这一行!
@小眼睛老鼠:
@豆汀鱼: 你看看 是那个对象为空啊
这是个事件,写的是对的。先实例化这个类得到实例a,然后a.OnGetInfoCompleted+=……
设置事件,这样当你调用a.GetPostHtmlResults方法时,执行完相关操作就会转到你注入的监听方法中执行。
请教详细调用方法,谢谢!