如何使我的函数等到异步函数完成?
问题描述:
我需要一些代码来让我知道异步线程何时完成。这是我制作的Windows手机应用程序。该应用程序是一个公交车追踪器,用于显示实时离境,数据将从在线网页中获取。如何使我的函数等到异步函数完成?
我有这行代码在我GetDataFeed
功能
// start the asynchronous request
IAsyncResult aResult = BusStopFeedRequest.BeginGetResponse(new AsyncCallback(HandleFeedData), myState);
这将触发了我的HandleFeedData
功能,将节省一个网站源代码转换成文本字符串变量。
我的问题是我手机上的文本框不会填充字符串的内容,因为字符串中没有数据。这被textbox1.Text = obj.GetText()
调用,它应该返回我的实例化类中的私有字符串。
我已经调查使用aResult.AsyncWaitHandle.WaitOne()
,并试图为aResult.IsCompleted()
方法轮询但是从我阅读和发现自己,这只是不工作。该WaitOne
抛出一个意外的错误和IsCompleted
轮询是一个永无止境的循环。
有没有人有任何见解我能做些什么让我的功能等待异步请求完成于是更新我的类变量,所以我的文本框,就可以看到数据
答
你肯定的是,字符串实际上是被下载的? “BeginGetResponse”是WebRequest类中的一项功能,在Windows Phone上不可用。有可能数据没有被下载。但是,如果正在下载的话,我建议你做这样的事情:
IAsyncResult aResult = BusStopFeedRequest.BeginGetResponse(new AsyncCallback(HandleFeedData));
然后:
private void HandleFeedData(IAsyncResult result)
{
string feedData = (string)result.AsyncState;
textbox1.Text = feedData;
// code to save the feedData here
}
不过,这将是有益的知道什么时候BusStopFeedRequest的“BeginGetResponse”被解雇。
答
在windows phone中,HTTPWebRequest包含BeginGetResponse和EndGetResponse方法。您需要在函数HanldeFeedData函数中添加类似的代码。
HttpWebResponse response=(result.AsyncState as HttpWebrequest).EndGetResponse(result) as HttpWebResponse;
string returnValue=null;
using (StreamReader sr=new StreamReader(response.GetResponseStrem())
{
returnValue=sr.ReadToEnd();
}
Dispatcher.BeginInvoke(new Action(()=>textbox1.Text=returnValue));
你能改善这个问题的标题吗? – 2011-04-22 00:28:52
http://xkcd.com/725/ – 2011-04-22 00:30:38
难道我的回答解决问题了吗? (我知道这是前一阵子,但如果你记得我的回答是否正确,我会很感激你的标记)。谢谢! :) – 2012-04-24 09:54:58