如何使方法暂停其执行,直到先前调用的异步回调方法完成

时间:2014-10-05 14:02:04

标签: c# xaml windows-phone-8

我正在开发一个应用程序,其中用户在文本框中输入句子。我使用TextBox.Text方法将TextBox中的文本作为字符串获取,我调用一个方法getTranslation(),它在内部调用几个异步回调,因为它需要

  • 建立与服务器的连接
  • 向POST Stream写入请求
  • 从服务器获取回复回复
  • 处理回复
  • 将响应返回到xaml页面

在应用程序的xaml页面中,我首先调用第一个将输入文本作为param传递的方法。然后,下一行代码调用返回响应方法,并将TextBlock内容设置为返回的响应。

这些是用于调用服务器的方法。

public void searchOnline(string inputtxt)
        {
        //Lines of code
            IAsyncResult writeRequestStreamCallback =
              (IAsyncResult)req.BeginGetRequestStream(new AsyncCallback(RequestStreamReady), req);
         }
        private void RequestStreamReady(IAsyncResult ar)
        {
        //Lines of code
            request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
        }
        private void GetResponseCallback(IAsyncResult ar)
        {
           //Lines of code
                IAsyncResult writeRequestStreamCallback = (IAsyncResult)serviceWebRequest.BeginGetResponse(new AsyncCallback(ServiceReady), serviceWebRequest);
         }
        private void ServiceReady(IAsyncResult ar)
        {
        //Lines of code
            System.IO.StreamReader streamRead = new System.IO.StreamReader(streamResponse);
            string responseString = streamRead.ReadToEnd();
            searchresult = responseString;
        }

        public string returner()
        {
            return searchresult;
        }

在xaml页面中,我调用以下代码

help.searchOnline(inputtextbox.Text);//line 1
                               outputtextbox.Text = help.returner();//line 2
                               outputtextbox.UpdateLayout();

我的问题是如何使xaml页面中的return方法等待,即第2行,更新文本块,直到收到响应,直到第1行更新搜索结果字符串?

1 个答案:

答案 0 :(得分:0)

仅同步重写方法。您只想继续使用OutputTextBox中的显示运行该程序。因此,应该等待获取数据的过程。

但是如果您需要在此过程中执行其他操作,则可以使用任务: (http://msdn.microsoft.com/en-us/library/system.threading.tasks.task(v=vs.110).aspx

通过这个类,您可以为操作的返回分配一个对象(TResult),因此请检查您的状态并按照您想要的方式进行,例如通过属性:    

public bool IsCompleted {get; }

哪个会告诉你SearchOnline是否完整!

除了这个属性之外,还有像Wait这样的方法,它们确实等待Task完成执行,即等待SearchOnline方法更新OutputTextBox。

我想重申一下,研究Class System.Threading.Tasks.Task的功能是非常好的。

我希望它有所帮助:)