Alexandre
Alexandre

Reputation: 13318

IAsyncResult in WP7, how to know when an async method will be finished?

 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 should return the string value when a lambda function will be finished. My questions are:

Upvotes: 2

Views: 135

Answers (1)

Martin Brown
Martin Brown

Reputation: 25320

To see when the lambda is finished you could use a ManualResetEvent like this:

    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; 
    }

Upvotes: 1

Related Questions