首页 新闻 会员 周边 捐助

关于异步委托使用和调用

0
悬赏园豆:30 [已解决问题] 解决于 2016-03-24 10:30

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());
}
}

请问这个异步委托对不对,还有怎样调用它,谢谢!

豆汀鱼的主页 豆汀鱼 | 初学一级 | 园豆:175
提问于:2016-03-20 16:20
< >
分享
最佳答案
0

定义的地方就不说了

你已经定义了 

调用的地方也不用说了 你也已经调用了 不过不和规范 一般来说 

事件叫做 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 

 

收获园豆:30
小眼睛老鼠 | 老鸟四级 |园豆:2731 | 2016-03-21 14:44

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);
}

 

调用是这样的,但没执行和输出。。。

豆汀鱼 | 园豆:175 (初学一级) | 2016-03-21 16:11

@豆汀鱼: 打断点

小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2016-03-21 16:13

@小眼睛老鼠: 

“System.Web.HttpException”类型的异常在 System.Web.dll 中发生,但未在用户代码中进行处理

其他信息: 响应在此上下文中不可用。

 

显示这个错误!

豆汀鱼 | 园豆:175 (初学一级) | 2016-03-21 16:26

@豆汀鱼: 是再哪一行报的错 

还有就是 如果是异步的话 request 是没有用的 

是同步话 request才有用

不过你这个代码我看起来 像是同步的 

小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2016-03-21 16:30

@小眼睛老鼠: 

Response.Write(DataResults); 

这一行!

豆汀鱼 | 园豆:175 (初学一级) | 2016-03-21 16:36

@小眼睛老鼠: 

豆汀鱼 | 园豆:175 (初学一级) | 2016-03-21 16:40

@豆汀鱼: 你看看 是那个对象为空啊

小眼睛老鼠 | 园豆:2731 (老鸟四级) | 2016-03-21 16:47
其他回答(1)
0

这是个事件,写的是对的。先实例化这个类得到实例a,然后a.OnGetInfoCompleted+=……

设置事件,这样当你调用a.GetPostHtmlResults方法时,执行完相关操作就会转到你注入的监听方法中执行。

于为源 | 园豆:956 (小虾三级) | 2016-03-21 13:09

请教详细调用方法,谢谢!

支持(0) 反对(0) 豆汀鱼 | 园豆:175 (初学一级) | 2016-03-21 13:30
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册