<?xml version="1.0" encoding="iso-8859-15"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/"><channel><title>blogs.ASPItalia.com</title><link>http://blogs.aspitalia.com</link><description>blogs.ASPItalia.com</description><language>it-it</language><copyright>1998-2009 ASPItalia.com/blogs.ASPItalia.com</copyright><generator>Generated by feed.ASPItalia.com 'Caesar Reborn' 2009.6.29</generator><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><sy:updateBase>1998-01-01T12:00+00:00</sy:updateBase><lastBuildDate>Wed, 01 Jul 2009 16:45:00 GMT</lastBuildDate><image><title>blogs.ASPItalia.com</title><url>http://gui.ASPItalia.com/images/aspitalia/syndication.gif</url><link>http://blogs.aspitalia.com</link></image><item><title>HTML 5 vs RIA? Niente di nuovo</title><link>http://blogs.aspitalia.com/daniele/post2517/HTML-RIA.aspx</link><pubDate>Wed, 01 Jul 2009 16:45:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2517' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Nel 1998 Javascript avrebbe dovuto salvare il mondo. Nel 2009 forse jQuery l'ha reso un po' più divertente.&lt;/p&gt;&lt;p&gt;Nel 1999 c'era XML, le Data Island e chissà cosa. Poi XHTML. Poi Flash. Poi Javascript, che ritorna sempre. Poi AJAX, le RIA. Ora HTML 5.&lt;/p&gt;&lt;p&gt;Sempre la solita identica cosa: guerre di religione inutili tra questo vs quest'altro. Possibile che non ci sia nessuno al mondo che riesce a capire che l'alternativa è la cosa migliore? Tanto poi alla fine, come dimostra la storia, o vince una soluzione, oppure, beatamente, si usano entrambe.&lt;/p&gt;&lt;p&gt;Comunque mi fa ridere questa &amp;quot;corsa&amp;quot; ad HTML 5 quando le specifiche non sono ancora finali e, soprattutto, il fatto che l'unico browser a supportarle è uscito ieri mi fa davvero pensare che siamo una strana razza, noi che lavoriamo sul web. E non è esattamente una buona cosa.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Javascript/" rel="tag"&gt;Javascript&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Silverlight/" rel="tag"&gt;Silverlight&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/XAML/" rel="tag"&gt;XAML&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/AJAX/" rel="tag"&gt;AJAX&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/XML/" rel="tag"&gt;XML&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Daniele Bochicchio</dc:creator><category>Mondo Web, Javascript, Silverlight, XAML, AJAX, XML</category><guid isPermaLink="true">http://blogs.aspitalia.com/daniele/post2517/HTML-RIA.aspx</guid><slash:comments>3</slash:comments><wfw:comment>http://blogs.aspitalia.com/daniele/post2517/HTML-RIA.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/daniele/CommentRSS2517.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2517</trackback:ping></item><item><title>Migliorare la lettura di un sito</title><link>http://blogs.aspitalia.com/az/post2516/Migliorare-Lettura-Sito.aspx</link><pubDate>Thu, 25 Jun 2009 18:02:20 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2516' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Mi piace il progetto &lt;a title="link esterno" href="http://lab.arc90.com/experiments/readability/"&gt;Readibility&lt;/a&gt;, da un sito pieno di riquadri, banner e inutilità varie (IMHO), è possibile con un solo click passare per esempio da:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.aspitalia.com/img/andrewz/migliorarelaletturadiunsito_1197c/image_2.png"&gt;&lt;img title="layout normale" border="0" alt="layout normale" src="http://blogs.aspitalia.com/img/andrewz/migliorarelaletturadiunsito_1197c/image_thumb.png" width="524" height="467" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;a:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.aspitalia.com/img/andrewz/migliorarelaletturadiunsito_1197c/image_4.png"&gt;&lt;img title="risultato finale" border="0" alt="risultato finale" src="http://blogs.aspitalia.com/img/andrewz/migliorarelaletturadiunsito_1197c/image_thumb_1.png" width="524" height="467" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Comodo per stampe. Ed è anche personalizzabile. Il tutto grazie ad un sapiente uso di Javascript. Carino.&lt;/p&gt; &lt;p&gt;&lt;em&gt;Mia nota personale e domanda a me stesso: se ci si trova in due o più a condividere un'idea, è giusto buttarsi in ciò che c'è già nell'inutilità generale dell'insulsaggine del già visto?&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Javascript/" rel="tag"&gt;Javascript&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/XHTML/" rel="tag"&gt;XHTML&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>Software, Javascript, XHTML</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2516/Migliorare-Lettura-Sito.aspx</guid><slash:comments>5</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2516/Migliorare-Lettura-Sito.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2516.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2516</trackback:ping></item><item><title>.NET Framework 4.0 beta 1: ASP.NET MVC</title><link>http://blogs.aspitalia.com/daniele/post2515/.NET-Framework-4.0-Beta-1-ASP.NET-MVC.aspx</link><pubDate>Tue, 09 Jun 2009 18:56:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2515' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;ASP.NET MVC sarà incluso in ASP.NET 4.0 e VS 2010, con una versione specifica, che al momento ha come version number 2.0, ma sono certo che avranno tempo e modo di trasformare in 4.0, perchè, come dimostra anche Entity Framework, le novità da introdurre sono talmente tante che merita un salto di versione così elevato...&lt;/p&gt;&lt;p&gt;Ironia su queste sottigliezze&amp;#xa0;a parte, stando a &lt;a href="http://www.haacked.com/archive/2009/06/09/aspnetmvc-vs10beta1-roadmap.aspx" target="_blank"&gt;Phil Haack&lt;/a&gt;, PM di ASP.NET MVC, in beta 2 &amp;quot;rientreranno&amp;quot; diretti, senza necessità di installare add-on.&lt;/p&gt;&lt;p&gt;L'installer (con i template che mancano) si può scaricare da &lt;a href="http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=28527" target="_blank"&gt;&lt;strong&gt;CodePlex&lt;/strong&gt;&lt;/a&gt; (e la versione è la 1.1, anche se poi diventerà 2.0), con tanto di &lt;a href="http://aspnet.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=28527#DownloadId=71127" target="_blank"&gt;&lt;strong&gt;release notes&lt;/strong&gt;&lt;/a&gt;. Dove c'è anche la &lt;a href="http://aspnet.codeplex.com/Wiki/View.aspx?title=Road%20Map&amp;referringTitle=Home" target="_blank"&gt;&lt;strong&gt;roadmap&lt;/strong&gt;&lt;/a&gt; verso la 2.0, per ora molto fumosa.&lt;/p&gt;&lt;p&gt;Ci sono anche gli snippet per VS 2010, che sono davvero interessanti perchè semplificano il lavoro ripetitivo e sono una novità assoluta di questa versione per il markup (mentre c'erano già per il codice vero e proprio).&lt;/p&gt;&lt;p&gt;Non è dato sapere se ASP.NET MVC 2.0 sarà legato al .NET Framework 4.0, rilascio dopo, durante o prima la RTM. Pare che invece ci sarà comunque compatibilità con la &lt;strong&gt;versione 3.5 SP 1&lt;/strong&gt; e VS 2008 SP 1.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_4.0/" rel="tag"&gt;.NET Framework 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_4.0/" rel="tag"&gt;ASP.NET 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_MVC/" rel="tag"&gt;ASP.NET MVC&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Visual_Studio/" rel="tag"&gt;Visual Studio&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Daniele Bochicchio</dc:creator><category>ASP.NET, .NET Framework, .NET Framework 4.0, ASP.NET 4.0, ASP.NET MVC, Visual Studio</category><guid isPermaLink="true">http://blogs.aspitalia.com/daniele/post2515/.NET-Framework-4.0-Beta-1-ASP.NET-MVC.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/daniele/post2515/.NET-Framework-4.0-Beta-1-ASP.NET-MVC.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/daniele/CommentRSS2515.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2515</trackback:ping></item><item><title>Entity Framework e le performance con la Like</title><link>http://blogs.aspitalia.com/sm15455/post2514/Entity-Framework-Performance-Like.aspx</link><pubDate>Tue, 09 Jun 2009 05:00:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2514' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Nel bel mezzo della notte insonne ho deciso di fare qualche test per verificare quanto il problema mostrato in questo &lt;a href="http://www.linqitalia.com/script/124/ottimizzare-where-operatore-like-entity-framework.aspx"&gt;script&lt;/a&gt; fosse rilevante. &lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;Ho creato una tabella con un solo campo di tipo varchar(50) e l'ho popolata con 500.000 righe. poi ho creato una console application ed ho eseguito la stessa query per 100 volte utizzando prima la sintassi LINQ To Entities e poi quella Entity SQL. &lt;/p&gt; &lt;p&gt;Il risultato è abbastanza impietoso perchè la sintassi LINQ To Entities impiega 1'02''815 mentre quella Entity SQL impiega 1''221. La differenza di 1 minuto su 100 query è enorme. questo fatto è da considerare quando si vogliono fare applicazioni scalabili con Entity Framework.. tenetelo a mente&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;Stay Tuned...&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/ADO.NET_Entity_Framework/" rel="tag"&gt;ADO.NET Entity Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/LINQ/" rel="tag"&gt;LINQ&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Stefano Mostarda</dc:creator><category>Entity Framework In Action, ADO.NET Entity Framework, LINQ</category><guid isPermaLink="true">http://blogs.aspitalia.com/sm15455/post2514/Entity-Framework-Performance-Like.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/sm15455/post2514/Entity-Framework-Performance-Like.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/SM15455/CommentRSS2514.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2514</trackback:ping></item><item><title>Bing! Rieccomi!</title><link>http://blogs.aspitalia.com/ale/post2513/Bing-Rieccomi.aspx</link><pubDate>Sat, 06 Jun 2009 20:48:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2513' border="0" style="width:1px; height:1px;" /&gt;&lt;blockquote style="MARGIN-RIGHT: 0px" dir="ltr"&gt;&lt;blockquote style="MARGIN-RIGHT: 0px" dir="ltr"&gt;&lt;p&gt;Dopo un lungo silenzio e' tempo di ricominciare a scrivere qualcosa su questo blog. Per chi si chieda che cosa e' successo negli ultimi dodici mesi di silenzio la risposta e' un url semplice e breve : &lt;a href="http://www.bing.com"&gt;http://www.bing.com&lt;/a&gt; &lt;/p&gt;&lt;p&gt;Negli ultimi mesi io ed il mio team siamo stati parecchio indaffarati: le interfacce per l'autosuggerimento durante la digitazione delle query, i provider per Firefox, i nuovi tipi per le Bing API... Non ci siamo annoiati.&lt;/p&gt;&lt;p&gt;Se non avete ancora provato Bing e le Bing API, fatelo (e fatemi sapere che ne pensate ;-) )&lt;/p&gt;&lt;p&gt;A presto con news su nuovi tool e librerie.&lt;/p&gt;&lt;p&gt;--Alessandro&lt;/p&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Alessandro Catorcini</dc:creator><category>CLR Hosting</category><guid isPermaLink="true">http://blogs.aspitalia.com/ale/post2513/Bing-Rieccomi.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/ale/post2513/Bing-Rieccomi.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ale/CommentRSS2513.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2513</trackback:ping></item><item><title>Entity Framework e la generazione di codice POCO</title><link>http://blogs.aspitalia.com/sm15455/post2512/Entity-Framework-Generazione-Codice.aspx</link><pubDate>Tue, 02 Jun 2009 18:22:55 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2512' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Una delle cose più &lt;strong&gt;S&lt;/strong&gt;gradite di Entity Framework 4.0 è il fatto che il designer non genera classi POCO. Questa scelta è ovvia e rimarrà quella di default anche in RTM per mantenere la compatibilità col passato. La buona notizia è che per la RTM il team dovrebbe anche includere un template T4 per la generazione di classi POCO.&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;La certezza assoluta è che questo template genererà le classi aggiungendole allo stesso assembly in cui si trova l'EDMX. Ora che finalmente abbiamo un sistema &lt;strong&gt;OTTIMO-FANTASTICO-ECCEZIONALE-MERAVIGLIOSO-PERFETTO&lt;/strong&gt; di generazione del codice, questa limitazione si può superare. Cercando un pò in rete e partendo dalla base del template esistente, sono arrivato a creare un template che permette di:&lt;/p&gt; &lt;p&gt;Generare le classi e l'objectcontext in classi separate.&lt;/p&gt; &lt;p&gt;Aggiungere le classi ad un assembly diverso da quello in cui si trova l'edmx. Nell'assembly dell'ObjectModel o del DomainModel ad esempio. (Facoltativo).&lt;/p&gt; &lt;p&gt;Aggiungere l'objectcontext ad un assembly diverso da quello in cui si trova l'edmx. Nell'assembly del DAL ad esempio. (Facoltativo).&lt;/p&gt; &lt;p&gt;Mantenete il proprio codice aggiunto alle entities anche quando l'entità viene rigenerata.&lt;/p&gt; &lt;p&gt;&amp;#160;&lt;/p&gt; &lt;p&gt;Ovviamente il tutto è molto Beta 1 ma credo sia un ottimo punto di partenza per capire come funziona il T4 e per avere classi POCO da subito. In altri post vedremo come ho risolto alcuni problemi. nel frattempo potete scaricare il template a questo &lt;a href="http://lab.aspitalia.com/60/template-generare-classi-entity-framework-4.0.aspx" target="_blank"&gt;indirizzo&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_4.0/" rel="tag"&gt;.NET Framework 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ADO.NET_Entity_Framework/" rel="tag"&gt;ADO.NET Entity Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ORM/" rel="tag"&gt;ORM&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Stefano Mostarda</dc:creator><category>Entity Framework In Action, .NET Framework, .NET Framework 4.0, ADO.NET Entity Framework, ORM</category><guid isPermaLink="true">http://blogs.aspitalia.com/sm15455/post2512/Entity-Framework-Generazione-Codice.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/sm15455/post2512/Entity-Framework-Generazione-Codice.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/SM15455/CommentRSS2512.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2512</trackback:ping></item><item><title>Silverlight - Real time audio peak meter </title><link>http://blogs.aspitalia.com/ricciolo/post2511/Silverlight-Real-Time-Audio-Peak-Meter.aspx</link><pubDate>Sun, 31 May 2009 09:14:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2511' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;In un &lt;a href="http://blogs.aspitalia.com/ricciolo/post2506/Silverlight-Audio-Peak-Meter.aspx"&gt;post&lt;/a&gt; precedente ho mostrato di come si può realizzare un misuratore di picchi per l'audio di un &lt;b&gt;MediaElement&lt;/b&gt; precalcolandoli con un'applicazione console. Ovviamente questa non è la prassi normale di tutti i lettori normali, dove il calcolo della FFT applicata ai samples avviene in real time, man mano che questi vengono renderizzati sulla periferica audio.&lt;/p&gt;&lt;p&gt;Da Silverlight 2.0 sull'oggetto MediaElement&amp;#xa0;è presente un metodo SetSource che accetta uno Stream oppure un'oggetto &lt;b&gt;MediaStreamSource&lt;/b&gt;. Questa classe ha dei metodi che MediaElement chiama, come OpenMediaAsync, GetSampleAsync, SeekAsync per chiederci di aprire la sorgente, di restituirgli gruppi di samples o di posizionarci ad uno specifico timestamp. Con i metodi ReportOpenMediaCompleted, ReportGetSampleCompleted e ReportSeekCompleted non si fa altro che notificargli l'avvenuta operazione e ciclicamente mandargli pacchetti audio/video.&lt;/p&gt;&lt;p&gt;La brutta notizia è che i samples audio e video devono essere compressi (MP4, WMV) e quindi quello che noi possiamo fare è solo fare da tramite per fonire tracce audio e video con i protocolli che vogliamo: RTP, UPNP, streaming custom. Questa è una brutta notizia perché per applicare la FFT occorre avere i samples grezzi, già decodificati. L'oggetto MediaElement non permette di caricare file &lt;b&gt;WAV&lt;/b&gt; direttamente, ma il MediaStreamSouce permette invece di passare anche i samples raw, che il file WAV appunto contiene. Sebbene si potrebbe scrivere un decoder MP3, non sono così pazzo da farlo :-), perciò ho scelto di creare un file &lt;b&gt;WavMediaStreamSource&lt;/b&gt; che carica tramite WebRequest un file wav e&amp;#xa0;legge&amp;#xa0;l'header per conoscere il numero di canali, i samples al secondo (solitamente 44100) e i bit (8/16). L'implementazione poi non fa altro che rigirare i byte al MediaElement.&lt;/p&gt;&lt;p&gt;Ho portato poi l'algoritmo FFT e di calcolo dei picchi sulla mia libreria Silverlight e diviso il controllo del post precedente in due parti: &lt;b&gt;DataAudioPeakMeter&lt;/b&gt; e &lt;b&gt;SamplesAudioPeakMeter&lt;/b&gt;. Il primo lavora con il file dat precalcolato e funziona con tutti i formati supportati da SL. Il secondo lavora solo con i file WAV, ma funziona in real time. Entrambi poi fanno uso della &lt;b&gt;BarVisualization&lt;/b&gt; per l'animazione.&lt;/p&gt;&lt;p&gt;L'utilizzo è piuttosto semplice:&lt;/p&gt;
&lt;div class="codeboxheader"&gt; &lt;/div&gt;&lt;div class="codebox"&gt;&lt;pre&gt;&lt;span style="color:#0000FF"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;MediaElement&lt;/span&gt; &lt;span style="color:#FF0000"&gt;AutoPlay&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;False&amp;quot;&lt;/span&gt;
              &lt;span style="color:#FF0000"&gt;x&lt;/span&gt;:&lt;span style="color:#FF0000"&gt;Name&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;media&amp;quot;&lt;/span&gt; &lt;span style="color:#0000FF"&gt;/&amp;gt;&lt;/span&gt;

&lt;span style="color:#008000"&gt;&amp;lt;!-- Visualization --&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000FF"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#C71585"&gt;a&lt;/span&gt;:&lt;span style="color:#800000"&gt;SamplesAudioPeakMeter&lt;/span&gt; &lt;span style="color:#FF0000"&gt;x&lt;/span&gt;:&lt;span style="color:#FF0000"&gt;Name&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;sa&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000FF"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#C71585"&gt;a&lt;/span&gt;:&lt;span style="color:#800000"&gt;BarVisualization&lt;/span&gt; &lt;span style="color:#FF0000"&gt;BarSegmentHeight&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;4&amp;quot;&lt;/span&gt;
        &lt;span style="color:#FF0000"&gt;BarMargin&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;
        &lt;span style="color:#FF0000"&gt;BarSegmentMargin&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;
        &lt;span style="color:#FF0000"&gt;StrokeBrush&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;Yellow&amp;quot;&lt;/span&gt;
        &lt;span style="color:#FF0000"&gt;StrokeThickness&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000FF"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#C71585"&gt;a&lt;/span&gt;:&lt;span style="color:#800000"&gt;BarVisualization.BarBrush&lt;/span&gt;&lt;span style="color:#0000FF"&gt;&amp;gt;&lt;/span&gt;
            &lt;span style="color:#0000FF"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;LinearGradientBrush&lt;/span&gt; &lt;span style="color:#FF0000"&gt;StartPoint&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;0,0&amp;quot;&lt;/span&gt; &lt;span style="color:#FF0000"&gt;EndPoint&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;0,1&amp;quot;&lt;/span&gt;&lt;span style="color:#0000FF"&gt;&amp;gt;&lt;/span&gt;
                &lt;span style="color:#0000FF"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;GradientStop&lt;/span&gt; &lt;span style="color:#FF0000"&gt;Offset&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;1&amp;quot;&lt;/span&gt;
                              &lt;span style="color:#FF0000"&gt;Color&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;Black&amp;quot;&lt;/span&gt; &lt;span style="color:#0000FF"&gt;/&amp;gt;&lt;/span&gt;
                &lt;span style="color:#0000FF"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#800000"&gt;GradientStop&lt;/span&gt; &lt;span style="color:#FF0000"&gt;Offset&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;
                              &lt;span style="color:#FF0000"&gt;Color&lt;/span&gt;=&lt;span style="color:#0000FF"&gt;&amp;quot;Blue&amp;quot;&lt;/span&gt; &lt;span style="color:#0000FF"&gt;/&amp;gt;&lt;/span&gt;

            &lt;span style="color:#0000FF"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#800000"&gt;LinearGradientBrush&lt;/span&gt;&lt;span style="color:#0000FF"&gt;&amp;gt;&lt;/span&gt;
        &lt;span style="color:#0000FF"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#C71585"&gt;a&lt;/span&gt;:&lt;span style="color:#800000"&gt;BarVisualization.BarBrush&lt;/span&gt;&lt;span style="color:#0000FF"&gt;&amp;gt;&lt;/span&gt;
    &lt;span style="color:#0000FF"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#C71585"&gt;a&lt;/span&gt;:&lt;span style="color:#800000"&gt;BarVisualization&lt;/span&gt;&lt;span style="color:#0000FF"&gt;&amp;gt;&lt;/span&gt;
&lt;span style="color:#0000FF"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#C71585"&gt;a&lt;/span&gt;:&lt;span style="color:#800000"&gt;SamplesAudioPeakMeter&lt;/span&gt;&lt;span style="color:#0000FF"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Da codice poi dobbiamo legare la sorgente wav sia al MediaElement che al SamplesAudioPeakMeter:&lt;/p&gt;
&lt;div class="codeboxheader"&gt; &lt;/div&gt;&lt;div class="codebox"&gt;&lt;pre&gt;WavMediaStreamSource source = &lt;span style="color:#0000FF"&gt;new&lt;/span&gt; WavMediaStreamSource(&lt;span style="color:#0000FF"&gt;new&lt;/span&gt; Uri(&amp;quot;&lt;span style="color:#8B0000"&gt;test1.wav&lt;/span&gt;&amp;quot;, UriKind.RelativeOrAbsolute));
source.Loop = &lt;span style="color:#0000FF"&gt;true&lt;/span&gt;;

&lt;span style="color:#008000"&gt;// Binding Source -&amp;gt; Visualization&lt;/span&gt;
sa.SetSource(source);
&lt;span style="color:#008000"&gt;// Binding Source -&amp;gt; MediaElement&lt;/span&gt;
media.SetSource(source);&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ed ecco il risultato:&lt;/p&gt;
&lt;img src="http://blogs.aspitalia.com/img/Ricciolo/fft.png" /&gt;
&lt;p&gt;Ovviamente i file wav sono di grandi dimensioni quindi questa tecnica è adatta per file di piccola di dimensione sulla quale fare loop, ma meglio di niente :-). Poi speriamo che magari nella RTM di Silverlight 3.0 ci sia la possibilità di accedere ai samples già decodificati.&lt;/p&gt;
&lt;p&gt;Infine le performance: escludendo l'animazione sono rimasto piuttosto colpito. La mia CPU resta su un 2% per calcolare FFT e picchi. Includendo l'animazione si arriva poi ad un 25/30%, ma va considerato che SL tenta sempre di andare al massimo di frame rate per l'esecuzione delle animazioni.&lt;br/&gt;Presto metterò i sorgenti: promesso!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Silverlight/" rel="tag"&gt;Silverlight&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Silverlight_-_animazioni/" rel="tag"&gt;Silverlight - animazioni&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Silverlight_2.0/" rel="tag"&gt;Silverlight 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/XAML/" rel="tag"&gt;XAML&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Cristian "Ricciolo" Civera</dc:creator><category>Silverlight, Silverlight - animazioni, Silverlight 2.0, XAML</category><guid isPermaLink="true">http://blogs.aspitalia.com/ricciolo/post2511/Silverlight-Real-Time-Audio-Peak-Meter.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2511/Silverlight-Real-Time-Audio-Peak-Meter.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2511.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2511</trackback:ping></item><item><title>Salvare immagini Bitmap con Silverlight 3.0</title><link>http://blogs.aspitalia.com/ricciolo/post2510/Salvare-Immagini-Bitmap-Silverlight-3.0.aspx</link><pubDate>Fri, 29 May 2009 17:56:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2510' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;In &lt;strong&gt;Silverlight 3.0&lt;/strong&gt; è stato aggiunta la possibilità di salvare file in locale attraverso la &lt;strong&gt;SaveFileDialog&lt;/strong&gt;. Per motivi di sicurezza, questa può essere visualizzata solo all'interno di un evento scatenato dall'utente (pressione del pulsante, ecc)&amp;#xa0;mentre attraverso OpenFile è possibile poi aprire uno Stream per la scrittura sulla quale è possibile scrivere qualsiasi cosa.&lt;/p&gt;&lt;p&gt;In una discussione con &lt;a href="http://blogs.aspitalia.com/nostromo/"&gt;Marco&lt;/a&gt; ci è venuto il dubbio se si poteva salvare immagini in locale, ma purtroppo la cosa non è molto semplice da raggiungere. In SL infatti non ci sono API per effettuare encoding ed decoding di immagini ad eccezione del passare uno Stream da visualizzare. Inoltre con &lt;strong&gt;WriteableBitmap&lt;/strong&gt; è stata aggiunta la possibilità di caricare uno Stream o di renderizzare un &lt;strong&gt;UIElement&lt;/strong&gt; su un'immagine, ma poi non è possibile accedere ai byte. Insomma, se si ha un'immagine già codificata in JPEG/PNG basta semplicemente travasare lo Stream sorgente verso il file locale, altrimenti se si ha solo i byte grezzi dell'immagine occorre scriversi il motore di encoding e di creazione del contenitore.&lt;/p&gt;&lt;p&gt;Per fortuna c'è il buon vecchio file &lt;strong&gt;BMP&lt;/strong&gt;, la cui definizione si può trovare &lt;a href="http://en.wikipedia.org/wiki/BMP_file_format"&gt;qui&lt;/a&gt;, che è abbastanza semplice da creare&amp;#xa0;e a parte dover accodare i byte dell'immagine dal basso verso l'altro, non necessita di algoritmi di compressione. Ovviamente il file risultante è di grandi dimensioni, ma non dev'essere trasportato in rete, ma bensì salvato direttamente in locale. Ho scritto quindi un &lt;strong&gt;BitmapEncoder&lt;/strong&gt; e un BitmapFrame per salvare un'immagine in BMP, lo trovate completo di sorgente &lt;a href="http://lab.aspitalia.com/Ricciolo/Downloads/SLSaveBitmap.zip"&gt;qua&lt;/a&gt;. L'esempio allegato genera un'immagine con un algoritmo e la mostra anche attraverso un WriteableBitmap.&lt;/p&gt;&lt;p&gt;&lt;img align="baseline" src="http://blogs.aspitalia.com/img/Ricciolo/SLBitmap.jpg" border="0" hspace="0" complete="true" complete="true" /&gt;&lt;/p&gt;&lt;p&gt;Purtroppo non serve a tantissimo, perché attualmente la WriteableBitmap non permette di accedere ai pixel e quindi non è possibile salvare screenshot effettuati sugli elementi. Potenzialmente si può creare qualsiasi file, ma ovviamente non è semplice doversi riscrivere librerie di creazione di file, non potendosi appoggiare a oggetti COM.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Silverlight/" rel="tag"&gt;Silverlight&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/XAML/" rel="tag"&gt;XAML&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Silverlight_3.0/" rel="tag"&gt;Silverlight 3.0&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Cristian "Ricciolo" Civera</dc:creator><category>Silverlight, XAML, Silverlight 3.0</category><guid isPermaLink="true">http://blogs.aspitalia.com/ricciolo/post2510/Salvare-Immagini-Bitmap-Silverlight-3.0.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2510/Salvare-Immagini-Bitmap-Silverlight-3.0.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2510.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2510</trackback:ping></item><item><title>.NET Framework 4.0 beta 1: Tuple</title><link>http://blogs.aspitalia.com/ricciolo/post2509/.NET-Framework-4.0-Beta-1-Tuple.aspx</link><pubDate>Wed, 27 May 2009 04:00:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2509' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Altro post per un&amp;#39;altra novità del .NET Framework 4.0: le classi &lt;b&gt;Tuple&lt;/b&gt;. In pratica sono delle classi generiche con tanti argomenti generici quanti sono le relative proprietà che esse espongono.&lt;/p&gt;
&lt;p&gt;Per esempio Tuple&amp;lt;T1, T2&amp;gt; ha una proprietà Item1 di tipo T1 e una proprietà Item2 di tipo T2. Ci vengono molto comode per quelle volte che nei nostri algoritmi, per velocizzare la scrittura del codice (o per pigrizia :-) ), abbiamo bisogno di una classe che faccia da repository dei valori. Inoltre la loro caratteristica è di implementare GetHashCode, Equals e l&amp;#39;interfaccia &lt;b&gt;IComparable&lt;/b&gt;, &lt;b&gt;IStructuralEquatable&lt;/b&gt; (nuova in .NET 4.0) e &lt;b&gt;IStructuralComparable&lt;/b&gt; (nuova in .NET 4.0) in modo che a parità dei valori, due istanze di Tuple diverse risultino uguali. Si comportano quindi come un valore atomico e sono l&amp;#39;ideale per essere utilizzate come chiavi per dictionary o per hash set.&lt;/p&gt;
&lt;p&gt;Per capirci quindi:&lt;/p&gt;
&lt;div class="codeboxheader"&gt; &lt;/div&gt;&lt;div class="codebox"&gt;&lt;pre&gt;var t = Tuple.Create&amp;lt;Int32, String&amp;gt;(2, &amp;quot;&lt;span style="color:#8B0000"&gt;ciao&lt;/span&gt;&amp;quot;);
var t2 = Tuple.Create&amp;lt;Int32, String&amp;gt;(2, &amp;quot;&lt;span style="color:#8B0000"&gt;ciao&lt;/span&gt;&amp;quot;);

Console.WriteLine(t.Item2);
Console.WriteLine(&amp;quot;&lt;span style="color:#8B0000"&gt;Reference equals: {0}&lt;/span&gt;&amp;quot;, Object.ReferenceEquals(t, t2));
Console.WriteLine(&amp;quot;&lt;span style="color:#8B0000"&gt;Equals: {0}&lt;/span&gt;&amp;quot;, t.Equals(t2));&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;stampa a video:&lt;/p&gt;
&lt;div class="codeboxheader"&gt; &lt;/div&gt;&lt;div class="codebox"&gt;&lt;pre&gt;ciao
Reference equals: False
Equals: True&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;In effetti c&amp;#39;è una forte somiglianza agli anonymous type sebbene quest&amp;#39;ultimi sono generati dal compilatore e hanno proprietà dal nome che vogliamo. In comune hanno infatti che due istanze diverse, ma con identici valori, risultano uguali se comparati tra loro. Non implementano però IStructuralEquatable, ma non credo che questo sia un problema. Se necessitiamo di lavorare a livello d&amp;#39;interfaccia allora tanto vale restituire una tuple nelle nostre query.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_4.0/" rel="tag"&gt;.NET Framework 4.0&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Cristian "Ricciolo" Civera</dc:creator><category>.NET 4.0, .NET Framework, .NET Framework 4.0</category><guid isPermaLink="true">http://blogs.aspitalia.com/ricciolo/post2509/.NET-Framework-4.0-Beta-1-Tuple.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2509/.NET-Framework-4.0-Beta-1-Tuple.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2509.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2509</trackback:ping></item><item><title>.NET Framework 4.0 beta1: le classi Lazy&amp;lt;T&amp;gt; e LazyVariable&amp;lt;T&amp;gt;</title><link>http://blogs.aspitalia.com/ricciolo/post2508/.NET-Framework-4.0-Beta1-Classi-LazyT-LazyVariableT.aspx</link><pubDate>Tue, 26 May 2009 16:42:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2508' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Tra le tante piccole e grandi novità del .NET Framework 4.0 ci sono le classi &lt;b&gt;Lazy&amp;lt;T&amp;gt;&lt;/b&gt; e &lt;b&gt;LazyVariable&amp;lt;T&amp;gt;&lt;/b&gt;. Il concetto è molto semplice: istanziamo un tipo passando un delegate ad una funzione che restituisce un valore; la prima volta che interroghiamo la proprietà Value, il delegate viene chiamato e il valore persistito per le successive interrogazioni.&lt;/p&gt;
&lt;p&gt;Ecco un esempio:&lt;/p&gt;
&lt;div class="codeboxheader"&gt; &lt;/div&gt;&lt;div class="codebox"&gt;&lt;pre&gt;&lt;span style="color:#0000FF"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000FF"&gt;string&lt;/span&gt;[] args)
{
    Lazy&amp;lt;String&amp;gt; v = &lt;span style="color:#0000FF"&gt;new&lt;/span&gt; Lazy&amp;lt;String&amp;gt;(GetValue);
    Lazy&amp;lt;String&amp;gt; v2 = v;

    Console.WriteLine(v.Value);
    Console.WriteLine(v.Value);
    Console.WriteLine(v2.Value);
}

&lt;span style="color:#0000FF"&gt;private&lt;/span&gt; &lt;span style="color:#0000FF"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF"&gt;string&lt;/span&gt; GetValue()
{
    Console.WriteLine(&amp;quot;&lt;span style="color:#8B0000"&gt;GetValue called&lt;/span&gt;&amp;quot;);
    &lt;span style="color:#0000FF"&gt;return&lt;/span&gt; &amp;quot;&lt;span style="color:#8B0000"&gt;ciao&lt;/span&gt;&amp;quot;;
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;che stampa a video:&lt;/p&gt;
&lt;div class="codeboxheader"&gt; &lt;/div&gt;&lt;div class="codebox"&gt;&lt;pre&gt;GetValue called
ciao
ciao
ciao&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;La differenza con LazyVariable è che questa è una struct invece che una classe. Perciò il seguente codice:&lt;/p&gt;
&lt;div class="codeboxheader"&gt; &lt;/div&gt;&lt;div class="codebox"&gt;&lt;pre&gt;&lt;span style="color:#0000FF"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF"&gt;void&lt;/span&gt; Main(&lt;span style="color:#0000FF"&gt;string&lt;/span&gt;[] args)
{
    LazyVariable&amp;lt;String&amp;gt; v = &lt;span style="color:#0000FF"&gt;new&lt;/span&gt; LazyVariable&amp;lt;String&amp;gt;(GetValue);
    LazyVariable&amp;lt;String&amp;gt; v2 = v;

    Console.WriteLine(v.Value);
    Console.WriteLine(v.Value);
    Console.WriteLine(v2.Value);
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;stampa:&lt;/p&gt;
&lt;div class="codeboxheader"&gt; &lt;/div&gt;&lt;div class="codebox"&gt;&lt;pre&gt;GetValue called
ciao
ciao
GetValue called
ciao&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Questo perché quando si assegna v a v2, viene copiata l'intera struttura e non mantenuto un riferimento alla classe come avviene con Lazy.&lt;br/&gt;Entrambe le classi sono inoltre serializzabili e accettano nel costruttore un &lt;b&gt;LazyExecutionMode&lt;/b&gt; che dispone di tre valori: NotThreadSafe, EnsureSingleThreadSafeExecution, AllowMultipleThreadSafeExecution. In questo modo possiamo decidere se accedere a Value indicando che solo un thread ci accederà, oppure più thread ci possono accedere e solo una volta il delegate viene eseguito (tramite lock), oppure più thread ci accedono e una o più volte il delegate potrebbe essere eseguito (il default). Mi piacerebbe che implementassero anche la conversione implicita verso T così da non dover interrogare Value, ma forse lo faranno :-)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_4.0/" rel="tag"&gt;.NET Framework 4.0&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Cristian "Ricciolo" Civera</dc:creator><category>.NET 4.0, .NET Framework, .NET Framework 4.0</category><guid isPermaLink="true">http://blogs.aspitalia.com/ricciolo/post2508/.NET-Framework-4.0-Beta1-Classi-LazyT-LazyVariableT.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2508/.NET-Framework-4.0-Beta1-Classi-LazyT-LazyVariableT.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2508.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2508</trackback:ping></item><item><title>C# 4.0 Beta 1, quello che io ho visto</title><link>http://blogs.aspitalia.com/az/post2507/CSharp-4.0-Beta-Visto.aspx</link><pubDate>Sun, 24 May 2009 18:33:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2507' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Giovedì ho trovato il tempo di installare sulla mia macchina la nuova versione di Visual Studio 2010 beta 1. Leggendo i vari documenti sulle novità, la mia curiosità è stata attratta dalle novità del linguaggio C# della version 4.0. Da quel che ho capito sono quattro le &lt;em&gt;novità&lt;/em&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Dynamic Typed Objects&lt;/li&gt;&lt;li&gt;Optional and Named Parameters&lt;/li&gt;&lt;li&gt;Improved COM Interoperability&lt;/li&gt;&lt;li&gt;Co/Contra-Variance&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Sui &lt;em&gt;dynamic&lt;/em&gt; ho avuto proprio una discussione sul fatto che la keywork &lt;em&gt;dynamic&lt;/em&gt; non centra nulla con &lt;em&gt;var&lt;/em&gt;. La dichiarazione di un oggetto come &lt;em&gt;dynamic&lt;/em&gt;, crea effettivamente un oggetto di tipo dinamico in runtime ed elaborato in late-binding, con tutti i problemi che ne derivano!&lt;/p&gt;&lt;p&gt;Scrivere queste linee di codice ora è perfettamente corretto:&lt;/p&gt;&lt;code&gt;dynamic az = &amp;quot;Andrea&amp;quot;;&lt;br /&gt;Console.WriteLine(az); // Andrea&lt;br /&gt;az = 14;&lt;br /&gt;az = 14 * 2;&lt;br /&gt;Console.WriteLine(az); // 28&lt;br /&gt;az = new System.Data.DataTable();&lt;br /&gt;Console.WriteLine(az.GetType()); // System.Data.DataTable&lt;/code&gt;&lt;p&gt;Ma questo nuovo oggetto è utilizzabile anche nelle dichiarazioni di metodi e altro:&lt;/p&gt;&lt;code&gt;Dynamic1(&amp;quot;aa&amp;quot;);&lt;br /&gt;Dynamic1(12);&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;static void Dynamic1(dynamic value)&lt;br /&gt;{&lt;br /&gt;&amp;#xa0;&amp;#xa0; if (value is string)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; Console.WriteLine(value + &amp;quot; is a string!&amp;quot;);&lt;br /&gt;&amp;#xa0;&amp;#xa0; if (value is int)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; Console.WriteLine(value + &amp;quot; is a int!&amp;quot;);&lt;br /&gt;}&lt;/code&gt;&lt;p&gt;Ma la potenzialità del &lt;em&gt;dynamic&lt;/em&gt; vanno ben oltre. E' possibile ora chiamare oggetti &lt;em&gt;COM &lt;/em&gt;in modo molto più semplice, ed è diventato anche banale caricare &lt;em&gt;runtime&lt;/em&gt; una &lt;em&gt;dll&lt;/em&gt; e utilizzarne i metodi. Per esempio, avevo questa classe in una dll esterna:&lt;/p&gt;&lt;code&gt;namespace TestDynamic&lt;br /&gt;{&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; public class Utilities&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; public string GetAll(string name)&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; return string.Format(&amp;quot;{0}: {1}&amp;quot;, name, DateTime.Now);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;}&lt;/code&gt;&lt;p&gt;Possiamo caricarla e utilizzarla con i &lt;em&gt;dynamic&lt;/em&gt; (senza &lt;em&gt;reference&lt;/em&gt;). Un esempio di codice che fa questo:&lt;/p&gt;&lt;code&gt;dynamic mya = Assembly.LoadFile(&amp;quot;../class.dll&amp;quot;);&lt;br /&gt;Type myaClassType = mya.GetType(&amp;quot;TestDynamic.Utilities&amp;quot;);&lt;br /&gt;dynamic myaDemoClassObj = Activator.CreateInstance(myaClassType);&lt;br /&gt;string val = myaDemoClassObj.GetAll(&amp;quot;az&amp;quot;);&lt;/code&gt;&lt;p&gt;Facile e comodo? Può essere, ma l'utilizzo del &lt;em&gt;dynamic &lt;/em&gt;non è immune da problemi. Innanzitutto prestazionale: come detto prima, tutto ciò che è &lt;em&gt;dynamic&lt;/em&gt; è elaborato in &lt;em&gt;runtime/late-binding&lt;/em&gt;, dunque con tutti i problemi di prestazioni che ne derivano. L'esempio&amp;#xa0;di codice qui sopra, se confrontato con un metodo tradizionale di loading di una dll e utilizzo del &lt;em&gt;reflector&lt;/em&gt; o, meglio, di &lt;em&gt;interfacce&lt;/em&gt;, perde su tutti i fronti. Secondo problema: Visual Studio 2010 non è in grado di fornici l'intellisense:&lt;/p&gt;&lt;p&gt;&lt;img align="baseline" alt="Dynamic in Visual Studio 2010 beta 1" src="http://blogs.aspitalia.com/img/andrewz/Immagini/dynamic.JPG" border="0" hspace="0" complete="true" complete="true" /&gt;&lt;/p&gt;&lt;p&gt;L'utilizzo dei parametri opzionali o dichiarandone il nome è una di quelle novità che ricordano tanto ciò che &lt;em&gt;Visual Basic&lt;/em&gt; offre da parecchio tempo:&lt;/p&gt;&lt;code&gt;public string MyMethod(int Id = 0, string Name = &amp;quot;AZ&amp;quot;)&lt;br /&gt;{&lt;br /&gt;...&lt;br /&gt;}&lt;/code&gt;&lt;p&gt;Che crea in automatico gli &lt;em&gt;overload&lt;/em&gt; del metodo passando ai parametri i valori di &lt;em&gt;default&lt;/em&gt; specificati:&lt;/p&gt;&lt;code&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; MyMethod();&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; MyMethod(1);&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0;&amp;#xa0; MyMethod(1, &amp;quot;Andrea&amp;quot;);&lt;/code&gt;&lt;p&gt;E se nell'esempio sopra volessimo passare solo il parametro &lt;em&gt;Name&lt;/em&gt; e non l'&lt;em&gt;Id&lt;/em&gt;? Questo codice ci darebbe errore, perché si aspetta in ogni caso come primo parametro un &lt;em&gt;int&lt;/em&gt;:&lt;/p&gt;&lt;code&gt;MyMehotd(&amp;quot;Andrea&amp;quot;);&lt;/code&gt;&lt;p&gt;Una delle altre novità di &lt;em&gt;C# 4.0&lt;/em&gt;, è la possibilità di dichiarare oltre al valore anche il parametro a cui sarà assegnato:&lt;/p&gt;&lt;code&gt;MyMethod(Name: &amp;quot;Andrea&amp;quot;);&lt;br /&gt;MyMethod(Name: &amp;quot;Andrea&amp;quot;, Id: 1);&lt;/code&gt;&lt;p&gt;L'ultima novità, &lt;em&gt;Covariance&lt;/em&gt;&amp;#xa0;e &lt;em&gt;Contravariance&lt;/em&gt;. La covariance permette di trattare gli oggetti come il tipo da cui deriva. Per esempio, avendo le classi:&lt;/p&gt;&lt;code&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; public class First&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; public class Second : First&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; {&lt;br /&gt;&amp;#xa0;&amp;#xa0;&amp;#xa0; }&lt;/code&gt;&lt;p&gt;Possiamo scrivere:&lt;/p&gt;&lt;code&gt;First[] coll = new Second[20];&lt;/code&gt;&lt;p&gt;Ma non possiamo in alcun modo utilizzare questa possibilità nel caso dei &lt;em&gt;generic&lt;/em&gt; essendo il C# a cui siamo abituati &lt;em&gt;invariant&lt;/em&gt;:&lt;/p&gt;&lt;code&gt;List&amp;lt;Second&amp;gt; xsecond = new List&amp;lt;Second&amp;gt;();&lt;br /&gt;List&amp;lt;First&amp;gt; xfirst = xsecond;&lt;br /&gt;&lt;br /&gt;Cannot implicitly convert type 'System.Collections.Generic.List&amp;lt;Test1.Second&amp;gt;' to 'System.Collections.Generic.IList&amp;lt;Test1.First&amp;gt;'.&lt;/code&gt;&lt;p&gt;Attualmente ci sono altri metodi per copiare un oggetto o una collection di oggetti (&lt;em&gt;cast&lt;/em&gt; o &lt;em&gt;Linq&lt;/em&gt;). Con la nuove versione di C#, abbiamo una nuova tecnica&amp;#xa0; ma, come scritto sopra, per ora è possibile solo con le &lt;em&gt;interfacce&lt;/em&gt; e &lt;em&gt;delegate&lt;/em&gt; modificare questo comportamento:&lt;/p&gt;&lt;code&gt;public class Other&amp;lt;T&amp;gt; where T : First // Or without constraint&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;public class Other2&amp;lt;T&amp;gt; : IOther2&amp;lt;T&amp;gt;&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;interface IOther2&amp;lt;out T&amp;gt;&lt;br /&gt;{&lt;br /&gt;}&lt;/code&gt;&lt;p&gt;Ora, grazie all'interfaccia (e la specifica del &lt;em&gt;generic T&lt;/em&gt; con &lt;em&gt;out&lt;/em&gt;), possiamo utilizzare anche gli oggetti derivati della nostra classe:&lt;/p&gt;&lt;code&gt;var xot2 = new Other2&amp;lt;Second&amp;gt;();&lt;br /&gt;IOther2&amp;lt;First&amp;gt; xot21 = xot2;&lt;/code&gt;&lt;p&gt;La keyword &lt;em&gt;out&lt;/em&gt; è utilizzata per specificare&amp;#xa0;gli oggetti in &lt;em&gt;output&lt;/em&gt;, mentre &lt;em&gt;in&lt;/em&gt; come è facilmente intuibile è utilizzabile come parametro &lt;em&gt;input&lt;/em&gt;&amp;#xa0;di metodi con i &lt;em&gt;delegate&lt;/em&gt;, eccole utilizzare entrambe con i &lt;em&gt;delegate&lt;/em&gt;:&lt;/p&gt;&lt;code&gt;delegate T Func1&amp;lt;out T&amp;gt;();&lt;br /&gt;delegate void Action1&amp;lt;in T&amp;gt;(T a);&lt;br /&gt;...&lt;br /&gt;// Covariance&lt;br /&gt;Func1&amp;lt;Second&amp;gt; secondx = () =&amp;gt; new Second();&lt;br /&gt;Func1&amp;lt;First&amp;gt; firstx = secondx;&lt;br /&gt;// Contravariance&lt;br /&gt;Action1&amp;lt;First&amp;gt; act1 = (ani) =&amp;gt; { Console.WriteLine(ani.ToString()); };&lt;br /&gt;Action1&amp;lt;Second&amp;gt; cat1 = act1;&lt;br /&gt;cat1(new Second());&lt;/code&gt;&lt;p&gt;Ho detto qualcosa di inesatto? E' facile che sia così: il mio studio sulle novità di questo linguaggio si basano su test e letture che il poco tempo libero attuale mi permette. Questa scusa mi lascia scevro di responsabilità? Se ne sono convinto io...&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_4.0/" rel="tag"&gt;.NET Framework 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Visual_Studio/" rel="tag"&gt;Visual Studio&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Andrea Zani</dc:creator><category>.NET4, .NET Framework, .NET Framework 4.0, Visual Studio</category><guid isPermaLink="true">http://blogs.aspitalia.com/az/post2507/CSharp-4.0-Beta-Visto.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/az/post2507/CSharp-4.0-Beta-Visto.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/az/CommentRSS2507.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2507</trackback:ping></item><item><title>Silverlight - Audio peak meter</title><link>http://blogs.aspitalia.com/ricciolo/post2506/Silverlight-Audio-Peak-Meter.aspx</link><pubDate>Sat, 23 May 2009 16:59:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2506' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Qualche tempo fa realizzai un &lt;a href="http://blogs.aspitalia.com/ricciolo/post2168/Spettro-Audio-WPF.aspx"&gt;controllo&lt;/a&gt; per l'analisi dello stream audio e la visualizzazione dei picchi attraverso &lt;strong&gt;WPF&lt;/strong&gt;. Nel tempo libero del tempo libero,&amp;#xa0;da appassionato di &lt;strong&gt;DirectShow&lt;/strong&gt; e di fuffologie mi son chiesto se si poteva fare una cosa simile anche in &lt;strong&gt;Silverlight&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Il problema è che in Silverlight non si ha a disposizione DirectShow, non si può usare codice unmanaged ne si può accedere allo stream audio. L'unico oggetto che abbiamo è &lt;strong&gt;MediaElement&lt;/strong&gt; che permette di riprodurre audio e video; nella versione 2.0 c'è la classe &lt;strong&gt;MediaStreamSource&lt;/strong&gt;, ma sebbene non abbia avuto ancora modo di provarla a fondo, permette di accedere allo stream codificato e non quello decodificato, perciò scrivere un decoder mp3 in codice managed non è proprio una passeggiata :-). Per poter applicare FFT e calcolare decibel e picchi dobbiamo infatti avere i byte grezzi, come i file wav.&lt;/p&gt;&lt;p&gt;Siccome per la maggior parte dei casi può bastare un piccolo loop su una canzone ho trovato una facile soluzione: precalcolare. In pratica ho realizzato una console application, interamente managed, che apre un file audio, calcola FFT ecc e salva in un file tutti i byte rappresentativi dei picchi, circa 12 suddivisi per 19 frequenze al secondo.&lt;/p&gt;&lt;p&gt;Una volta che si ha il file audio e il file .dat contenente i picchi, tramite un controllo posso mostrarne i valori. Il controllo &lt;strong&gt;AudioMeter&lt;/strong&gt; ha bisogno del file .dat e&amp;#xa0;del MediaElement sul quale basarsi per mostrare i picchi in funzione della posizione. Ecco il risultato:&lt;/p&gt;&lt;object width="480" height="385"&gt;&lt;embed width="480" height="385" src="http://www.youtube.com/v/ZavzJg4NK0Y&amp;hl=it&amp;fs=1&amp;rel=0" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always"&gt;&lt;/embed&gt;&lt;/embed&gt;&lt;//embed&gt;&lt;/embed&gt;&lt;//embed&gt;&lt;/&gt;&lt;//&gt;&lt;/embed&gt;&lt;//embed&gt;&lt;/&gt;&lt;//&gt;&lt;/&gt;&lt;//&gt;&lt;/&gt;&lt;//&gt;&lt;/object&gt;&lt;p&gt;Per rendere il più fluido possibile l'animazione intercetto &lt;strong&gt;CompositionTarget.Rendering&lt;/strong&gt; che viene scatenato ad ogni frame dell'applicazione Silverlight che viene renderizzato. Le barre che vanno su e giù sono invece animate da &lt;strong&gt;DoubleAnimation&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Devo dire che sono molto soddisfatto del risultato. Anche se&amp;#xa0;il video non rende moltissimo, l'animazione è molto fluida e ben sincronizzata, meglio di quanto avevo fatto con WPF.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/Silverlight/" rel="tag"&gt;Silverlight&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Silverlight_-_animazioni/" rel="tag"&gt;Silverlight - animazioni&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Silverlight_2.0/" rel="tag"&gt;Silverlight 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Silverlight_3.0/" rel="tag"&gt;Silverlight 3.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/XAML/" rel="tag"&gt;XAML&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Cristian "Ricciolo" Civera</dc:creator><category>Silverlight, Silverlight - animazioni, Silverlight 2.0, Silverlight 3.0, XAML</category><guid isPermaLink="true">http://blogs.aspitalia.com/ricciolo/post2506/Silverlight-Audio-Peak-Meter.aspx</guid><slash:comments>1</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2506/Silverlight-Audio-Peak-Meter.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2506.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2506</trackback:ping></item><item><title>.NET Framework 4.0 beta 1: modifiche agli assembly</title><link>http://blogs.aspitalia.com/ricciolo/post2505/.NET-Framework-4.0-Beta-1-Modifiche-Assembly.aspx</link><pubDate>Thu, 21 May 2009 20:22:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2505' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;La nuova versione del&lt;strong&gt; .NET Framework&lt;/strong&gt; è un passo molto importante perché oltre a&amp;#xa0;contenere nuove tecnologie o migliorie,&amp;#xa0;si può dire che&amp;#xa0;si dà anche&amp;#xa0;un po' una ripulita e una riorganizzazione visto che il framework era diventato un po' confuso quando dopo la versione 2.0 è stato aggiunta la 3.0 che era basata sempre sulla 2.0, poi allo stesso modo&amp;#xa0;la 3.5 ed infine il service pack 1 che introduceva ancora novità.&lt;/p&gt;&lt;p&gt;Innanzitutto date un occhio al &lt;a href="http://lab.ricciolo.aspitalia.com/metadatadiffviewer/metadatadiffviewer.html"&gt;MetadataDiffViewer&lt;/a&gt; che l'ho aggiornato alla versione 4.0 così non si perde nessuna novità. Innanzitutto&amp;#xa0;gli assembly sono tutti 4.0 e&amp;#xa0;balzano all'occhio&amp;#xa0;alcuni come &lt;strong&gt;System.Web.Routing&lt;/strong&gt; o &lt;strong&gt;System.Web.Abstractions&lt;/strong&gt; che esistono ancora, ma non contengono classi. Questo perché le loro classi sono state trasferite, come giusto che sia, nell'assembly Sys&lt;strong&gt;tem.Web&lt;/strong&gt;. Attraverso i due attributi &lt;strong&gt;TypeForwardedToAttribute&lt;/strong&gt; (presente già dalla versione 2.0)&amp;#xa0;e &lt;strong&gt;TypeForwaredFromAttribute&lt;/strong&gt; si indica a compilatori, CLR e serializzatori vari di redirigere dalla vecchia posizione a quella nuova. In questo modo le applicazioni compilate per il 3.5 SP1 vengono rediretti alla nuova versione 4.0. Le nuove applicazioni invece verranno compilate con la referenza corretta.&lt;/p&gt;&lt;p&gt;Oltre alle novità più importanti ho trovato qualcosa di interessante:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;una classe&lt;strong&gt; System.AggregateException&lt;/strong&gt; per raggruppare più eccezioni;&lt;/li&gt;&lt;li&gt;il nuovo namespace &lt;strong&gt;System.Collections.Concurrent&lt;/strong&gt; contenente Queue, Dictionary e&amp;#xa0;Stack già sincronizzate e quindi thread safe. Molto interessante la classe Partitioner per creare enumerazioni che smistano automaticamente il carico di lavoro tra più consumer che ne fanno richiesta;&lt;/li&gt;&lt;li&gt;il nuovo namespace &lt;strong&gt;System.Diagnostics.Contracts&lt;/strong&gt; che contiene in particolare la classe Contract per indicare nel codice verifiche da effettuare in fase di compilazione e/o a runtime all'inizio o alla fine di una funzione (ne parlerò in dettaglio con un altro post);&lt;/li&gt;&lt;li&gt;le classi relative a &lt;strong&gt;PLINQ&lt;/strong&gt;, a &lt;strong&gt;ParallelFX&lt;/strong&gt;, lock ottimizzati come: Task, Parallel, SpinLock, ecc.&lt;/li&gt;&lt;li&gt;le classi Tuple&lt;t1,...tn&gt;&lt;/t1,...tn&gt;&lt;/t1,...tn&gt;&lt;//t1,...tn&gt; usate da F# però quante volte può servire memorizzare delle informazioni in modo veloce senza creare una classe con proprietà apposite;&lt;/li&gt;&lt;li&gt;il nuovo namespace e assembly System.ComponentModel.Composition che contiene tutta la parte di&amp;#xa0;&lt;strong&gt;Managed Extensibility Framework&lt;/strong&gt;;&lt;/li&gt;&lt;li&gt;in &lt;strong&gt;System.Core&lt;/strong&gt;&amp;#xa0;tante nuove Action&lt;t1,&gt;&lt;/t1,&gt;&lt;/t1,&gt;&lt;//t1,&gt; e Func&lt;t1,&gt;&lt;/t1,&gt;&lt;/t1,&gt;&lt;//t1,&gt; :-) Per la parte di expression e delle query LINQ ci sono alcune nuove classi Expression che permettono di fare degli statement: GotoExpression, LoopExpression, SwitchExpression, TryExpression, ecc. Un bellissimo ExpressionVisitor per sfogliare un'espressione: ci voleva!;&lt;/li&gt;&lt;li&gt;i nuovi assembly. System.Web.DataVisualization e System.Windows.Forms.DataVisualization contenente i controlli di charting per web e windows.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;E questo è solo l'inizio, che bello che bello, tante cose nuove :-)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.5/" rel="tag"&gt;.NET Framework 3.5&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_4.0/" rel="tag"&gt;.NET Framework 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_4.0/" rel="tag"&gt;ASP.NET 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/LINQ/" rel="tag"&gt;LINQ&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Visual_Studio/" rel="tag"&gt;Visual Studio&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Cristian "Ricciolo" Civera</dc:creator><category>.NET 4.0, .NET Framework, .NET Framework 3.5, .NET Framework 4.0, ASP.NET, ASP.NET 4.0, LINQ, Visual Studio</category><guid isPermaLink="true">http://blogs.aspitalia.com/ricciolo/post2505/.NET-Framework-4.0-Beta-1-Modifiche-Assembly.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2505/.NET-Framework-4.0-Beta-1-Modifiche-Assembly.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2505.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2505</trackback:ping></item><item><title>.NET Framework 4.0 beta 1: la documentazione</title><link>http://blogs.aspitalia.com/daniele/post2504/.NET-Framework-4.0-Beta-1-Documentazione.aspx</link><pubDate>Thu, 21 May 2009 08:51:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2504' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Da qualche giorno è disponibile anche la documentazione per il .NET Framework 4.0 beta 1 e per VS 2010 beta 1.&lt;/p&gt;&lt;p&gt;Ecco i link:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/w0x726c2(VS.100).aspx" target="_blank"&gt;.NET Framework 4.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;in particolare, &lt;a href="http://msdn.microsoft.com/en-us/library/bb400852(VS.100).aspx" target="_blank"&gt;ASP.NET 4.0 beta 1&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/52f3sw5c(VS.100).aspx" target="_blank"&gt;Visual Studio 2010&lt;/a&gt;&lt;/li&gt;&lt;li&gt;in particolare, &lt;a href="http://msdn.microsoft.com/en-us/library/dd547188(VS.100).aspx" target="_blank"&gt;le novità&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Tutti i contenuti aggiornati sono nel nostro canale dedicato al &lt;a href="http://netfx4.winfxitalia.com/"&gt;.NET Framework 4.0&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_4.0/" rel="tag"&gt;.NET Framework 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET/" rel="tag"&gt;ASP.NET&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASP.NET_4.0/" rel="tag"&gt;ASP.NET 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Visual_Studio/" rel="tag"&gt;Visual Studio&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Daniele Bochicchio</dc:creator><category>.NET Framework, .NET Framework 4.0, ASP.NET, ASP.NET 4.0, Visual Studio</category><guid isPermaLink="true">http://blogs.aspitalia.com/daniele/post2504/.NET-Framework-4.0-Beta-1-Documentazione.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/daniele/post2504/.NET-Framework-4.0-Beta-1-Documentazione.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/daniele/CommentRSS2504.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2504</trackback:ping></item><item><title>.NET Framework 4.0 beta 1: Visual Studio 2010 e Training Kit disponibili per tutti</title><link>http://blogs.aspitalia.com/matteo/post2503/.NET-Framework-4.0-Beta-1-Visual-Studio-2010-Training.aspx</link><pubDate>Thu, 21 May 2009 07:25:06 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2503' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Come preannunciato nel &lt;a href="http://blogs.aspitalia.com/matteo/post2500/.net-framework-4.0-beta-1-visual-studio-2010.aspx"&gt;post precedente&lt;/a&gt;, il &lt;a href="http://msdn.microsoft.com/it-it/netframework/dd819232(en-us).aspx"&gt;download di Visual Studio 2010 beta 1&lt;/a&gt; è ora disponibile per tutti; inoltre anche il &lt;a href="http://www.microsoft.com/downloads/details.aspx?displaylang=en&amp;amp;familyid=752cb725-969b-4732-a383-ed5740f02e93#tm"&gt;Training Kit su Visual Studio 2010 e il .NET Framework 4&lt;/a&gt; è stato aggiornato alla beta 1.&lt;/p&gt; &lt;p&gt;Maggiori informazioni sul blog del team MSDN Italia &lt;a href="http://blogs.msdn.com/italy/archive/2009/05/20/visual-studio-2010-beta-1-disponibile-il-download-per-tutti.aspx"&gt;qui&lt;/a&gt; e &lt;a href="http://blogs.msdn.com/italy/archive/2009/05/20/visual-studio-2010-and-net-framework-4-training-kit.aspx"&gt;qui&lt;/a&gt; e, ovviamente, sul &lt;a href="http://netfx4.winfxitalia.com/"&gt;mini-sito in ASPItalia&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Buon download a tutti :-)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_4.0/" rel="tag"&gt;.NET Framework 4.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/ASPItalia.com/" rel="tag"&gt;ASPItalia.com&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Visual_Studio/" rel="tag"&gt;Visual Studio&lt;/a&gt;&lt;/p&gt;&lt;hr /&gt;&lt;p&gt;&lt;a href="http://www.aspitalia.com/"&gt;(C) 2009 ASPItalia.com Network - All rights reserved&lt;/a&gt;&lt;/p&gt;</description><dc:creator>Matteo Casati</dc:creator><category>.NET, .NET Framework, .NET Framework 4.0, ASPItalia.com, Visual Studio</category><guid isPermaLink="true">http://blogs.aspitalia.com/matteo/post2503/.NET-Framework-4.0-Beta-1-Visual-Studio-2010-Training.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/matteo/post2503/.NET-Framework-4.0-Beta-1-Visual-Studio-2010-Training.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/matteo/CommentRSS2503.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2503</trackback:ping></item></channel></rss>