如何使我的函数等到异步函数完成之后?

时间:2011-04-22 00:27:50

标签: c# asynchronous windows-phone

我需要一些代码才能让我知道异步线程何时完成。这是我正在制作的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的轮询处于永无止境的循环中。

有没有人深入了解我可以做些什么来让我的函数等待异步请求完成,以便更新我的类变量,以便我的文本框可以看到数据

2 个答案:

答案 0 :(得分:0)

您确定该字符串实际上正在下载吗? “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”何时被触发将会有所帮助。

答案 1 :(得分:0)

在Windows手机中,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));