Nella parte finale del codice del controller asincrono si vede perfettamente il meccanismo dell'
AsyncManager.OutstandingOperations, inizialmente impostato a un incremento di tre. Progressivamente, a ogni operazione viene decrementato fino ad arrivare a zero avviando l'esecuzione del rispettivo metodo
xxxxCompleted.
....
public void IndexAsync(string blog)
{ ViewData["Post"] = "Post da vari blog - modalità parallela asincrona";
AsyncManager.OutstandingOperations.Increment(3);
PostsBlogService postBlogService = new PostsBlogService();
postBlogService.GetTitlesCompleted += (sender, e) =>
{ AsyncManager.Parameters["titles"] = e.Value;
AsyncManager.OutstandingOperations.Decrement();
};
postBlogService.GetTitlesAsync();
MicrosoftMSDNNews msdnNewsService = new MicrosoftMSDNNews();
msdnNewsService.GetNewsCompleted += (sender, e) =>
{ AsyncManager.Parameters["Mnews"] = e.Value;
AsyncManager.OutstandingOperations.Decrement();
};
msdnNewsService.GetNewsAsync();
MicrosoftTechnetNews technetNewsService = new MicrosoftTechnetNews();
technetNewsService.GetNewsCompleted += (sender, e) =>
{ AsyncManager.Parameters["Tnews"] = e.Value;
AsyncManager.OutstandingOperations.Decrement();
};
technetNewsService.GetNewsAsync();
}
public ActionResult IndexCompleted(string[] titles, string[] mNews, string[] tNews)
{ return View("Common", new SiteViewModel { PostsBlog = titles,
MicrosoftMSDNNews = mNews,
MicrosoftTechnetNews = tNews
});
}
}
}
E questo è quasi tutto ciò che occorre fare per implementare un controller asincrono, ora vediamo come utilizzare il tutto nelle view. A seguire il breve codice della master page e del PostBlog:
MASTER PAGE<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>
<link href=<%=Url.Content("~/Content/Site.css")%> rel="stylesheet" type="text/css" /></head>
<body>
<div class="page">
<div id="header">
<div id="title">
<h1>Async Controller</h1>
</div>
<div id="menucontainer">
<ul id="menu">
<li><%= Html.ActionLink("Home", "Index", "Home")%></li> </ul>
</div>
</div>
<div id="main">
<asp:ContentPlaceHolder ID="MainContent" runat="server" />
<div id="footer">
</div>
</div>
</div>
</body>
</html>
PostBlog<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master"
Inherits="System.Web.Mvc.ViewPage<MVC2Sample.Asynchronous.Models.ViewStringModel>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
News
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2><%= Html.Encode(ViewData["title"]) %></h2>
<p><b>Ultimi Post</b></p>
<ul>
<% foreach (string title in Model.PostsBlog) { %> <li><a href="<%= Url.Content("http://www.bing.com/news/search?q=" + Html.Encode(title)) %>"> <%= Html.Encode(title)%></a></li>
<% } %>
</ul>
</asp:Content>