2012-03-07 3 views
2
public string MyMethod(string param1) 
    { 
     var url = string.Format(UrlMask, HttpUtility.UrlEncode(param1), Login, ApiKey); 
     HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 
     request.BeginGetResponse(result => 
       { 
        var requestInternal = (HttpWebRequest)result.AsyncState; 
        var response = (HttpWebResponse)requestInternal.EndGetResponse(result); 

        using (StreamReader streamReader = new StreamReader(response.GetResponseStream())) 
        { 
         var resultXml = XDocument.Load(response.GetResponseStream()); 
         var x = from r in resultXml.Descendants("node") 
           select r.Element("element").Value; 

        } 
       }, request); 

       return null; 
      } 

MyMethod должен вернуть значение string, когда функция лямбда будет завершена. Мои вопросы:IAsyncResult в WP7, как узнать, когда будет закончен асинхронный метод?

  • как я могу знать, когда лямбда-функция внутри request.BeginGetResponse будет закончена?
  • как MyMethod будет знать об этом, чтобы вернуть значение?

ответ

1

Чтобы увидеть, когда лямбда законченная вы могли бы использовать ManualResetEvent так:

public string MyMethod(string param1) 
    { 
     const int timeOutInMs = 1000; 

     using (ManualResetEvent ended = new ManualResetEvent(false)) 
     { 
      var url = string.Format(UrlMask, HttpUtility.UrlEncode(param1), Login, ApiKey); 
      HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest; 
      request.BeginGetResponse(result => 
             { 
              var requestInternal = (HttpWebRequest) result.AsyncState; 
              var response = (HttpWebResponse) requestInternal.EndGetResponse(result); 
              using (
               StreamReader streamReader = 
                new StreamReader(response.GetResponseStream())) 
              { 
               var resultXml = XDocument.Load(response.GetResponseStream()); 
               var x = from r in resultXml.Descendants("node") 
                 select r.Element("element").Value; 
              } 
              ended.Set(); 
             }, request); 

      if (!ended.WaitHandle.WaitOne(timeOutInMs)) 
      { 
       throw new TimeoutException("lambda took too long to complete"); 
      } 
     } 
     return null; 
    } 
Смежные вопросы