Silverlight里主线程异步Http请求后等待返回结果
Silverlight里,在主线程里,对远程的Http发请求,我使用HttpWebRequest类。这个类里没有.net3.5里的同步方法request.GetRespo...
Silverlight里,在主线程里,对远程的Http发请求,我使用HttpWebRequest类。这个类里没有. net 3.5里的同步方法
request.GetResponse而只有一个异步的方法request.BeginGetResponse和request.EndGetResponse。我的代码如下:
HttpWebRequest request= WebClient.Create(Uri);
IAsyResult asy = request.BeginGetResponse(CallbackHandle,request);
//下面的操作依赖于异步操作返回的结果
private void CallbackHandle(IAsyResult asy)
{
HttpWebRequest request = asy.State as HttpWebRequest;
HttpWebResponse response = request.EndGetResponse();
......
}
手工打的,可能有写错误,大概的思路应该表达清楚了。
这里我在调用request.BeginGetResponse后希望主线程能等待异步调用的结果后再往下走。不知道该怎么做。
我也用了IAsyResult.AsyWaithandle.WaitOne()但调用这个方法后,貌似就不会执行回调的函数CallbackHandle了。
跪求解决的方法,在线等,希望能详细解释,最好有代码。
谢谢 展开
request.GetResponse而只有一个异步的方法request.BeginGetResponse和request.EndGetResponse。我的代码如下:
HttpWebRequest request= WebClient.Create(Uri);
IAsyResult asy = request.BeginGetResponse(CallbackHandle,request);
//下面的操作依赖于异步操作返回的结果
private void CallbackHandle(IAsyResult asy)
{
HttpWebRequest request = asy.State as HttpWebRequest;
HttpWebResponse response = request.EndGetResponse();
......
}
手工打的,可能有写错误,大概的思路应该表达清楚了。
这里我在调用request.BeginGetResponse后希望主线程能等待异步调用的结果后再往下走。不知道该怎么做。
我也用了IAsyResult.AsyWaithandle.WaitOne()但调用这个方法后,貌似就不会执行回调的函数CallbackHandle了。
跪求解决的方法,在线等,希望能详细解释,最好有代码。
谢谢 展开
3个回答
展开全部
.Net中使用类库提供的 BeginXXX() 这种异步回调时,有几种方式可以猛咐选择实现线程同步:
1,异步回调后,调用 EndXXX()阻塞主线程,等待异竖槐步线程返回。
2,异步回调后,调用ar.AsyncWaitHandle.WaitOne(),阻塞主线程,等待异步线程返回,这种方式实际使用了一个信号量 AutoResetEvent 来同步线程的 , 这时候可以设置一个等待超时时间,不会像1那样一直傻等。
3,异步回调后,轮询 ar.IsCompleted ,直到 = true,主线程再继续处理下去。这种方式可以让主线程做其他的工作,枝纤纯由于要不停的查子线程状态,所以也比较占CPU时间。
4,异步回调后,调用自定义的回调函数进行处理,主线程不阻塞。这就是你用的这个方法。这也是最常用的方式,主线程可以继续响应UI.
你给的代码没问题,你可以在private void CallbackHandle(IAsyResult asy)中下断点看有没有执行。
如果没有进入这个回调函数的话,有可能是你的托管线程池 ThreadPool 满了,暂时没有可用的工作线程了。
如果进入了,在HttpWebResponse response = request.EndGetResponse(); 停下,那就是远程的URL无响应。你可以设置HttpWebRequest 的请求超时。
1,异步回调后,调用 EndXXX()阻塞主线程,等待异竖槐步线程返回。
2,异步回调后,调用ar.AsyncWaitHandle.WaitOne(),阻塞主线程,等待异步线程返回,这种方式实际使用了一个信号量 AutoResetEvent 来同步线程的 , 这时候可以设置一个等待超时时间,不会像1那样一直傻等。
3,异步回调后,轮询 ar.IsCompleted ,直到 = true,主线程再继续处理下去。这种方式可以让主线程做其他的工作,枝纤纯由于要不停的查子线程状态,所以也比较占CPU时间。
4,异步回调后,调用自定义的回调函数进行处理,主线程不阻塞。这就是你用的这个方法。这也是最常用的方式,主线程可以继续响应UI.
你给的代码没问题,你可以在private void CallbackHandle(IAsyResult asy)中下断点看有没有执行。
如果没有进入这个回调函数的话,有可能是你的托管线程池 ThreadPool 满了,暂时没有可用的工作线程了。
如果进入了,在HttpWebResponse response = request.EndGetResponse(); 停下,那就是远程的URL无响应。你可以设置HttpWebRequest 的请求超时。
展开全部
如果乱运使用异步的话,同步比较费事
request.GetResponse(CallbackHandle,request);
不如考虑哗悔梁直接执行而不前则使用异步
request.GetResponse(CallbackHandle,request);
不如考虑哗悔梁直接执行而不前则使用异步
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你的意思是用异步的方式实现同步吧。我没用过Silverlight, 只能码氏提供租模裂弊闭一点思路,希望有所帮助:
调用request.BeginGetResponse的线程在注册一个CallbackHandle(该回调函数向一个mailbox mbox_a发送一个消息),然后wait在mailbox mbox_a上面直到回调函数被调用。
调用request.BeginGetResponse的线程在注册一个CallbackHandle(该回调函数向一个mailbox mbox_a发送一个消息),然后wait在mailbox mbox_a上面直到回调函数被调用。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询