private IEnumerable<Task> ProcessRequesIterator(HttpContext context, MovieInfoResult miar)
        {

            if (context.Request.Path != "/")
            {
                ReplyError(HttpStatusCode.NotFound, "Resource does not exist", context.Response);
                yield return new Task(()=>
                                                       {
                                                           miar.IsCompleted = true;
                                                           ((ManualResetEvent)miar.AsyncWaitHandle).Set();
                                                           miar.Callback(miar);
                                                       });
                yield break;
            }


            if (context.Request.QueryString["t"] == null)
            {
                ReplyError(HttpStatusCode.BadRequest, "Requests must indicate a movie via parameter <b>t=<i>movie</i></b>", context.Response);
                yield return new Task(() =>
                                                       {
                                                           miar.IsCompleted = true;
                                                           ((ManualResetEvent)miar.AsyncWaitHandle).Set();
                                                           miar.Callback(miar);
                                                       });
                yield break;
            }

            string imdbRequestUri = null;
            if (context.Request.QueryString["y"] == null)
            {
                imdbRequestUri = String.Format("http://imdbapi.com/?t={0}", context.Request.QueryString["t"]);
            }
            else
            {
                imdbRequestUri = String.Format("http://imdbapi.com/?t={0}&y={1}", context.Request.QueryString["t"], context.Request.QueryString["y"]);
            }

            WebRequest imdbRequest = WebRequest.Create(imdbRequestUri);

            var imdbtask = Task.Factory.FromAsync(imdbRequest.BeginGetResponse
                                   , (Func<IAsyncResult, WebResponse>)imdbRequest.EndGetResponse
                                   , null);
            yield return imdbtask;

            HttpWebResponse imdbResponse = (HttpWebResponse)imdbtask.Result;

            if (imdbResponse.StatusCode == HttpStatusCode.OK)
            {
                JavaScriptSerializer jsonMaster = new JavaScriptSerializer();
                IMDbObj imdbObj = jsonMaster.Deserialize<IMDbObj>(new StreamReader(imdbResponse.GetResponseStream()).ReadToEnd());
                if (imdbObj != null && imdbObj.Response == "True")
                {
                    if (imdbObj.Plot != "N/A")
                    {
                        string bingRequestUri = String.Format("http://api.bing.net/json.aspx?AppId={0}&Query={1}&Sources=Translation&Version=2.2&Translation.SourceLanguage={2}&Translation.TargetLanguage={3}", BING_KEY, imdbObj.Plot, "en", "pt");

                        for (int retries = 0; retries < MAX_RETRIES; ++retries)
                        {

                            WebRequest bingRequest = (HttpWebRequest)WebRequest.Create(bingRequestUri);

                            var bingTask = Task.Factory.FromAsync(bingRequest.BeginGetResponse
                                                                  ,
                                                                  (Func<IAsyncResult, WebResponse>)
                                                                  bingRequest.EndGetResponse
                                                                  , null);

                            yield return bingTask;

                            HttpWebResponse bingResponse = (HttpWebResponse) bingTask.Result;

                            if (bingResponse.StatusCode == HttpStatusCode.OK)
                            {
                                BingObj bingObj = jsonMaster.Deserialize<BingObj>(new StreamReader(bingResponse.GetResponseStream()).ReadToEnd());
                                if (bingObj.SearchResponse.Translation != null)
                                {
                                    imdbObj.Plot = bingObj.SearchResponse.Translation.Results[0].TranslatedTerm;
                                    break;
                                }
                            }

                            int retrieslocal = retries;
                            yield return new Task(() =>
                                                                   {
                                                                       new Timer((_) => { }
                                                                                 , null, 000 + 1000*retrieslocal +
                                                                                         _rand.Next(2000), 0
                                                                           );
                                                                   });

                        }
                    }
                    context.Response.StatusCode = (int)HttpStatusCode.OK;
                    context.Response.ContentType = "text/plain; charset=utf-8"; // In the final version use "application/json; charset=utf-8"
                    string jsonData = jsonMaster.Serialize(imdbObj);
                    var writer = new StreamWriter(context.Response.OutputStream);
                    writer.Write(jsonData);
                    writer.Flush();
                    miar.IsCompleted = true;
                    ((ManualResetEvent)miar.AsyncWaitHandle).Set();
                    miar.Callback(miar);
                    yield break;
                }
            }

            ReplyError(HttpStatusCode.NotFound, "Movie not found", context.Response);
        }
 public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
 {
     var miar = new MovieInfoResult(cb, extraData);
     ProcessRequesIterator(context, miar).Run();
     return miar;
 }