C# 纳什。谢谢在上面的示例中,我受益于新的VS AsyncCTP。在您的示例代码中,您也从中受益。对于您exmaple来说,如果我们需要用老式的方式执行,那么代码是什么?您可以使用QueryMovies递减(使用联锁)将共享计数初始化为3,并在计数达到0时运行

C# 纳什。谢谢在上面的示例中,我受益于新的VS AsyncCTP。在您的示例代码中,您也从中受益。对于您exmaple来说,如果我们需要用老式的方式执行,那么代码是什么?您可以使用QueryMovies递减(使用联锁)将共享计数初始化为3,并在计数达到0时运行,c#,asp.net-mvc,asynchronous,async-ctp,asp.net-mvc-4,C#,Asp.net Mvc,Asynchronous,Async Ctp,Asp.net Mvc 4,纳什。谢谢在上面的示例中,我受益于新的VS AsyncCTP。在您的示例代码中,您也从中受益。对于您exmaple来说,如果我们需要用老式的方式执行,那么代码是什么?您可以使用QueryMovies递减(使用联锁)将共享计数初始化为3,并在计数达到0时运行该方法的其余部分。 public class Movie { public string Title { get; set; } public string Url { get; set; } public string


纳什。谢谢在上面的示例中,我受益于新的VS AsyncCTP。在您的示例代码中,您也从中受益。对于您exmaple来说,如果我们需要用老式的方式执行,那么代码是什么?您可以使用
QueryMovies
递减(使用联锁)将共享计数初始化为3,并在计数达到0时运行该方法的其余部分。
public class Movie
{
    public string Title { get; set; }
    public string Url { get; set; }
    public string BoxArtUrl { get; set; }
}

public class MovieM {

    public IEnumerable<Movie> M2009 { get; set; }
    public IEnumerable<Movie> M2010 { get; set; }
    public IEnumerable<Movie> M2011 { get; set; }
}

public class HomeController : AsyncController  {

    public async Task<ActionResult> GetMoviesM()  {

        var profiler = MiniProfiler.Current; // it's ok if this is null

        var pageSize = 1000;
        var imageCount = 0;

        using (profiler.Step("Start pulling data (Async) and return it")) { 

            var m2009 = await QueryMoviesAsync(2009, imageCount, pageSize);
            var m2010 = await QueryMoviesAsync(2010, imageCount, pageSize);
            var m2011 = await QueryMoviesAsync(2011, imageCount, pageSize);

            return View(new MovieM { 
                M2009 = m2009,
                M2010 = m2010,
                M2011 = m2011
            });
        }
    }

    XNamespace xa = "http://www.w3.org/2005/Atom";
    XNamespace xd = "http://schemas.microsoft.com/ado/2007/08/dataservices";
    XNamespace xm = "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata";

    string query = "http://odata.netflix.com/Catalog/Titles?$filter=ReleaseYear eq {0}&$skip={1}&$top={2}&$select=Url,BoxArt";

    async Task<IEnumerable<Movie>> QueryMoviesAsync(int year, int first, int count)  {

        var client = new WebClient();
        var url = String.Format(query, year, first, count);
        var data = await client.DownloadStringTaskAsync(new Uri(url));
        var movies =
            from entry in XDocument.Parse(data).Descendants(xa + "entry")
            let properties = entry.Element(xm + "properties")
            select new Movie
            {
                Title = (string)entry.Element(xa + "title"),
                Url = (string)properties.Element(xd + "Url"),
                BoxArtUrl = (string)properties.Element(xd + "BoxArt").Element(xd + "LargeUrl")
            };
        return movies.AsEnumerable();
    }
}
var m2009Task = QueryMoviesAsync(2009, imageCount, pageSize);
var m2010Task = QueryMoviesAsync(2010, imageCount, pageSize);
var m2011Task = QueryMoviesAsync(2011, imageCount, pageSize);
await Task.WhenAll(m2009Task, m2010Task, m2011Task);
var m2009 = await m2009Task;
var m2010 = await m2010Task;
var m2011 = await m2011Task;