Я не так хорош в асинхронном программировании, поэтому вопрос может быть на низком уровне.
Я создал асинхронный метод, как показано ниже, с помощью Async CTP на ASP.NET MVC 4 Dev. Предварительный просмотр:
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();
}
}
Код работает просто отлично. Когда мы запускаем ту же функцию в настольном приложении (например, в приложении WPF), мы видим ощутимую разницу в производительности. Пользовательский интерфейс не заблокирован, данные сразу же выводятся на экран, когда они доступны.
Но в веб-приложении я действительно не вижу разницы. Я также создал ту же функцию, что и синхронизация, и обе они почти одинаковы.
Что я хотел бы знать, так это то, что:
- Я запускаю это приложение на компьютере с процессором Intel Core 2 Duo T5750 2,00 ГГц. Влияет ли количество процессоров на производительность асинхронного потока на С#?
- Я делаю что-то не так с точки зрения веб-приложения?