<?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/ricciolo/</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>Sun, 31 May 2009 09:14:00 GMT</lastBuildDate><image><title>blogs.ASPItalia.com</title><url>http://gui.ASPItalia.com/images/aspitalia/syndication.gif</url><link>http://blogs.aspitalia.com/ricciolo/</link></image><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>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: Windows Communication Foundation</title><link>http://blogs.aspitalia.com/ricciolo/post2498/.NET-Framework-4.0-Beta-1-Windows-Communication-Foundation.aspx</link><pubDate>Mon, 18 May 2009 14:00:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2498' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Vista l'imminente uscita del &lt;strong&gt;.NET Framework 4.0&lt;/strong&gt; beta 1 vediamo un po' tra le numerose novità, quali sono quelle che riguardano WCF.&amp;#xa0;Nonostate fino ad ora non è stata resa pubblica una build completa si conoscono già le principali nuove caratteristiche.&lt;/p&gt;&lt;p&gt;Si parte dai miglioramenti di prestazioni del &lt;strong&gt;DataContractSerializer&lt;/strong&gt;, motore principale per la serializzazione degli oggetti e un nuovo &lt;strong&gt;DataContractResolver&lt;/strong&gt; che permette di personalizzare la risoluzione dei tipi. La configurazione, punto dolente della prima versione, è stata semplificata. Ora è possibile definire un servizio e/o un behavior con name vuoto e si ottiene una configurazione predefinita per tutti i servizi dell'hosting. I file svc sono poi auto configuranti e ciò significa che viene creato automaticamente un endpoint basandosi sulle configurazioni predefinite dei servizi HTTP.&lt;/p&gt;&lt;p&gt;Sono disponibili poi nuovi binding e nuovi canali tra i quali la possibilità di fare &lt;strong&gt;HTTP polling duplex&lt;/strong&gt; (usato da Silverlight), di esporre un servizio tramite &lt;strong&gt;UDP&lt;/strong&gt;, un nuovo sistema di claim basato su &lt;strong&gt;Geneva&lt;/strong&gt;, nome in codice del nuovo framework per l'autenticazione e gestione dell'identità. WCF 4.0 aderisce alle specifiche &lt;strong&gt;Basic Profile 1.2&lt;/strong&gt; che garantiscono una migliore interoperabilità tra piattaforme diverse ed implementa inoltre &lt;strong&gt;WS-Discovery&lt;/strong&gt; e il routing. Il primo permette ad un servizio di annunciarsi attraverso endpoint conosciuti che i possibili client possono individuare ed andare a consumare. Con il servizio di routing è invece possibile porre uno strato intermedio che dirotti le richieste verso gli endpoint effettivi a seconda dei carichi od in base a regole XPath applicate sul messaggio.&lt;/p&gt;&lt;p&gt;WCF inoltre si accopia con Windows Workflow Foundation diventando praticamente un solo framework. Questo perché dall'idea di Workflow Services, introdotti con il service pack 1 del .NET Framework 3.5, si è passati ad una&amp;#xa0;forte cooperazione ed integrazione tra le tue tecnologie. Partecipano allo stesso sistema di tracing e di tracking, di gestione degli errori, di transazione e sfruttando &lt;strong&gt;WAS&lt;/strong&gt; e tutti gli strumenti aggiuntivi messi a disposizione per IIS7, raccolti sotto il nome di &lt;strong&gt;Dublin&lt;/strong&gt;, permettono di esporre workflow attraverso servizi e&amp;#xa0;di gestire e monitorare i workflow facilitando moltissimo la creazione di servizi duraturi nel tempo e scalabili.&lt;/p&gt;&lt;p&gt;Maggiori informazioni e le informazioni per il download sono disponibili nel nostro mini-sito 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_3.0/" rel="tag"&gt;.NET Framework 3.0&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/Windows_Communication_Foundation/" rel="tag"&gt;Windows Communication Foundation&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Workflow_Foundation/" rel="tag"&gt;Windows Workflow Foundation&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework/" rel="tag"&gt;.NET Framework&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, .NET Framework 3.0, .NET Framework 4.0, Windows Communication Foundation, Windows Workflow Foundation, .NET Framework</category><guid isPermaLink="true">http://blogs.aspitalia.com/ricciolo/post2498/.NET-Framework-4.0-Beta-1-Windows-Communication-Foundation.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2498/.NET-Framework-4.0-Beta-1-Windows-Communication-Foundation.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2498.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2498</trackback:ping></item><item><title>Mostrare la WebCam in Silverlight</title><link>http://blogs.aspitalia.com/ricciolo/post2492/Mostrare-WebCam-Silverlight.aspx</link><pubDate>Thu, 07 May 2009 11:00:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2492' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Nel &lt;a href="http://blogs.aspitalia.com/ricciolo/post2491/Comunicazione-TCP-Silverlight-WPF.aspx"&gt;precedente post&lt;/a&gt; ho illustrato la mia idea di dialogo tra Silverlight e la macchina host, ma ora vediamo un caso pratico.&lt;/p&gt;
&lt;p&gt;Prima di tutto ho preparato un&amp;#39;applicazione Windows senza finestre, ma che rimane sulla system tray mettendosi in ascolto come policy server e su un&amp;#39;altra porta in attesa di connessioni. Questo &amp;quot;server&amp;quot; alla prima connessione avvia un filtro &lt;b&gt;DirectShow&lt;/b&gt; che prende l&amp;#39;immagine della WebCam, prende ogni frame attraverso un &lt;b&gt;Sample Grabber&lt;/b&gt; e lo comprime in Jpeg ad una qualità non troppo impegnativa. I bytes risultati vengono inviati al client preceduti da 8 byte che indicano la dimensione dell&amp;#39;immagine e quindi dei bytes che il client si deve aspettare. Ciò che ottengo quindi è di fatto un &lt;b&gt;Motion Jpeg&lt;/b&gt; pià alcuni controlli che il server fa per saltare frame qualora il client sia in ritardo a ricevere i fotogrammi.&lt;/p&gt;
&lt;p&gt;Il client Silverlight invece avvia la connessione e in modo ciclico legge nel buffer i primi 8 byte per conoscere la dimensione dell&amp;#39;immagine. Carica i restanti byte con i quale crea un &lt;b&gt;MemoryStream&lt;/b&gt; che dà poi in pasto al metodo &lt;b&gt;BitmapImage.SetSource&lt;/b&gt;. Quest&amp;#39;ultimo carica l&amp;#39;immagine che viene poi associata ad un oggetto &lt;b&gt;Image&lt;/b&gt; di Silverlight. In pratica quindi, vi è un flusso continuo di bytes di immagini compresse che vengono poi ricostruite per formare i fotogrammi dell&amp;#39;immagine con il quale poi ci si può sbizzarrire come si vuole.&lt;/p&gt;
&lt;p&gt;Ho creato poi un deployment con &lt;b&gt;ClickOnce&lt;/b&gt; per avviare il server automaticamente e dei byte &amp;quot;magici&amp;quot; che manda il client per chiudere il server. Questo il risultato finale:&lt;/p&gt;
&lt;object width="480" height="385"&gt;&lt;param name="movie" value="http://www.youtube.com/v/t1u9G8myG9Y&amp;hl=it&amp;fs=1&amp;rel=0&amp;color1=0x2b405b&amp;color2=0x6b8ab6"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/t1u9G8myG9Y&amp;hl=it&amp;fs=1&amp;rel=0&amp;color1=0x2b405b&amp;color2=0x6b8ab6" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;p&gt;Silverlight con questa tecnica si comporta bene e l&amp;#39;uso della CPU è non è intenso, garantendo sempre un flusso fluido dell&amp;#39;immagine.&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_2.0/" rel="tag"&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.0/" rel="tag"&gt;.NET Framework 3.0&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/Silverlight/" rel="tag"&gt;Silverlight&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/Windows_7/" rel="tag"&gt;Windows 7&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/Windows_Client/" rel="tag"&gt;Windows Client&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, .NET Framework, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5, Silverlight 2.0, Windows 7, Windows Client, XAML</category><guid isPermaLink="true">http://blogs.aspitalia.com/ricciolo/post2492/Mostrare-WebCam-Silverlight.aspx</guid><slash:comments>2</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2492/Mostrare-WebCam-Silverlight.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2492.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2492</trackback:ping></item><item><title>Comunicazione TCP tra Silverlight e WPF</title><link>http://blogs.aspitalia.com/ricciolo/post2491/Comunicazione-TCP-Silverlight-WPF.aspx</link><pubDate>Wed, 06 May 2009 21:46:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2491' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Negli ultimi giorni mi sono incuriosito su come risolvere un'esigenza che potrebbe capitarmi in futuro: la comunicazione tra &lt;b&gt;Silverlight&lt;/b&gt; e una application &lt;b&gt;WPF/WinForms&lt;/b&gt;.&lt;br /&gt;Silverlight ha potenzialità limitate e potrebbe utile usare un&amp;#39;applicazione classica locale che non ha limiti in termini di funzionalità.&lt;/p&gt;
&lt;p&gt;Per questo scopo in Silverlight fortunatamente hanno lasciato la classe &lt;b&gt;Socket&lt;/b&gt; che, sebbene il suo utilizzo differisce dal .NET Framework, permette di connettersi ad un end point e dialogare direttamente con i bytes, permettendo ampio margine di movimento e consentendo di implementare protocolli standard o custom.&lt;/p&gt;
&lt;p&gt;Con questo post non è mio intento spiegare in dettaglio come si usa il socket, ma illustrare come vedo io una possibile implementazione e una collaborazione tra un&amp;#39;applicazione locale e una in Silverlight. Innanzitutto bisogna tenere conto che Silverlight può connettersi solo al range di porte &lt;b&gt;4502-4534&lt;/b&gt;, per ovvi motivi di sicurezza: evitare che un&amp;#39;applicazione possa essere strumento di attacchi &lt;b&gt;DoS&lt;/b&gt; o &lt;b&gt;Reverse tunnel&lt;/b&gt;. Inoltre sia che ci si connetta al host di origine sia ad un host esterno (cross site), è necessario che il server sia in ascolto anche sulla porta &lt;b&gt;943&lt;/b&gt; (fissa) che su richiesta deve restituire il file &lt;i&gt;clientAccessPolicy.xml&lt;/i&gt; che già conosciamo per le richieste HTTP, ma che viene validato anche per le richieste socket.&lt;br /&gt;A &lt;a href="http://msdn.microsoft.com/en-gb/library/cc645032(VS.95).aspx#sectionToggle4"&gt;questo indirizzo&lt;/a&gt; troviamo un esempio di classe PolicyServer per implementare questa logica di validazione, qualora un client Silverlight la richieda.&lt;/p&gt;
&lt;p&gt;Con l&amp;#39;esempio indicato possiamo anche vedere come con il pattern Begin/End possiamo accettare nuove connessioni, inviare e ricevere bytes e creare di fatto un nostro protocollo di dialogo. Infatti l&amp;#39;idea è che una volta avviata l&amp;#39;applicazione Silverlight, qualora serva, facciamo partire quella locale che si mette in ascolto e con la quale poi si instaura un dialogo per chiedere informazioni al server o viceversa.&lt;/p&gt;
&lt;p&gt;Per far partire il server viene in aiuto &lt;b&gt;ClickOnce&lt;/b&gt; che grazie al sua capacità di installare un&amp;#39;applicazione al volo, la fa anche avviare. Basta navigare aprendo una popup al file .application e l&amp;#39;applicazione viene installata, previa conferma, e poi avviata.&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;private&lt;/span&gt; &lt;span style="color:#0000FF"&gt;void&lt;/span&gt; StartButton_Click(&lt;span style="color:#0000FF"&gt;object&lt;/span&gt; sender, RoutedEventArgs e)
{
    &lt;span style="color:#008000"&gt;// Avvio l'applicazione con ClickOnce&lt;/span&gt;
    Uri appUri = &lt;span style="color:#0000FF"&gt;new&lt;/span&gt; Uri(&amp;quot;&lt;span style="color:#8B0000"&gt;http://test.aspitalia.com:50658/setup/WebCamStreaming.application&lt;/span&gt;&amp;quot;);
    HtmlPage.PopupWindow(appUri, &amp;quot;&lt;span style="color:#8B0000"&gt;_blank&lt;/span&gt;&amp;quot;, &lt;span style="color:#0000FF"&gt;new&lt;/span&gt; HtmlPopupWindowOptions());

    &lt;span style="color:#008000"&gt;// Avvia la comunicazione TCP&lt;/span&gt;
    client.ConnectAsync();
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Attraverso poi un Mutex si può impedire che più istanze partano, lasciando sempre un solo server attivo. Qualora poi non serva più, possiamo sfruttare sempre la connessione tcp per inviare un segnale di chiusura dell&amp;#39;applicazione.&lt;/p&gt;
&lt;p&gt;Nel prossimo post mostrerò un esempio completo di tutto questo ambaradam di cui darò i sorgenti.&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_2.0/" rel="tag"&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.0/" rel="tag"&gt;.NET Framework 3.0&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/Silverlight/" rel="tag"&gt;Silverlight&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, .NET Framework, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5, Silverlight 2.0, XAML</category><guid isPermaLink="true">http://blogs.aspitalia.com/ricciolo/post2491/Comunicazione-TCP-Silverlight-WPF.aspx</guid><slash:comments>1</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2491/Comunicazione-TCP-Silverlight-WPF.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2491.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2491</trackback:ping></item><item><title>Dettagli sul metodo SelectDTO</title><link>http://blogs.aspitalia.com/ricciolo/post2488/Dettagli-Metodo-SelectDTO.aspx</link><pubDate>Sun, 26 Apr 2009 12:19:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2488' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Vorrei aggiungere alcuni dettagli sul &lt;a href="http://blogs.aspitalia.com/ricciolo/post2486/LINQ-Reflection-Parte.aspx"&gt;mio post&lt;/a&gt; riguardo LINQ to Reflection ed in particolare sull&amp;#39;extension method SelectDTO.&lt;/p&gt;
&lt;p&gt;Quello che il metodo fa è creare un expression identica a quello che faremmo scrivendo a mano il mapping. Prendiamo per esempio il classico Northwind e una classe di nome CustomerDTO:&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;public&lt;/span&gt; &lt;span style="color:#0000FF"&gt;class&lt;/span&gt; CustomerDTO
{
    &lt;span style="color:#0000FF"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF"&gt;string&lt;/span&gt; ContactName { &lt;span style="color:#0000FF"&gt;get&lt;/span&gt;; &lt;span style="color:#0000FF"&gt;set&lt;/span&gt;; }
    &lt;span style="color:#0000FF"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF"&gt;string&lt;/span&gt; ContactTitle { &lt;span style="color:#0000FF"&gt;get&lt;/span&gt;; &lt;span style="color:#0000FF"&gt;set&lt;/span&gt;; }
    
    &lt;span style="color:#0000FF"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF"&gt;override&lt;/span&gt; &lt;span style="color:#0000FF"&gt;string&lt;/span&gt; ToString() { 
        &lt;span style="color:#0000FF"&gt;return&lt;/span&gt; String.Format(&amp;quot;&lt;span style="color:#8B0000"&gt;{0} {1}&lt;/span&gt;&amp;quot;, ContactTitle, ContactName);
    }
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Per caricare la lista dei customer e creare istanze del nostro DTO dovremmo fare:&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;using&lt;/span&gt; (NorthwindEntities ne = &lt;span style="color:#0000FF"&gt;new&lt;/span&gt; NorthwindEntities()) {
    IList&amp;lt;customerdto&amp;gt; l = ne.Customers.Select(c =&amp;gt; &lt;span style="color:#0000FF"&gt;new&lt;/span&gt; CustomerDTO
    {
        ContactName = c.ContactName,
        ContactTitle = c.ContactTitle
    }).ToList();
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Usando il mio extension method invece:&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;using&lt;/span&gt; (NorthwindEntities ne = &lt;span style="color:#0000FF"&gt;new&lt;/span&gt; NorthwindEntities())
{
    IList&amp;lt;CustomerDTO&amp;gt; l = ne.Customers.SelectDTO&amp;lt;Customers, CustomerDTO&amp;gt;().ToList();
}
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Ciò che si produce è la medesima Expression del metodo classico, perciò LINQ to Entities la tradurrà nel medesimo modo, scaricando solo le colonne che ci interessano:&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;SELECT&lt;/span&gt; 
1 &lt;span style="color:#0000FF"&gt;AS&lt;/span&gt; [C1], 
[Extent1].[ContactName] &lt;span style="color:#0000FF"&gt;AS&lt;/span&gt; [ContactName], 
[Extent1].[ContactTitle] &lt;span style="color:#0000FF"&gt;AS&lt;/span&gt; [ContactTitle]
&lt;span style="color:#0000FF"&gt;FROM&lt;/span&gt; [dbo].[Customers] &lt;span style="color:#0000FF"&gt;AS&lt;/span&gt; [Extent1]&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Quello che si paga è solo il prezzo di iniziale di reflection per l&amp;#39;analisi delle proprietà in comune tra le due classi. Ovviamente questo è un inizio, va valutato perché comunque ha un costo, ha il vincolo di dover chiamare le proprietà che si vogliono copiare con lo stesso nome, ma lo si può estendere.&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/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;a href="http://tags.aspitalia.com/LINQ_to_Entities/" rel="tag"&gt;LINQ to Entities&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/LINQ_to_SQL/" rel="tag"&gt;LINQ to SQL&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 3.5, .NET Framework, .NET Framework 3.5, ADO.NET Entity Framework, LINQ, LINQ to Entities, LINQ to SQL</category><guid isPermaLink="true">http://blogs.aspitalia.com/ricciolo/post2488/Dettagli-Metodo-SelectDTO.aspx</guid><slash:comments>1</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2488/Dettagli-Metodo-SelectDTO.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2488.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2488</trackback:ping></item><item><title>Parallelizzare in Silverlight 2.0</title><link>http://blogs.aspitalia.com/ricciolo/post2487/Parallelizzare-Silverlight-2.0.aspx</link><pubDate>Tue, 21 Apr 2009 05:27:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2487' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Durante lo sviluppo di &lt;a href="http://lab.ricciolo.aspitalia.com/metadatadiffviewer/metadatadiffviewer.html"&gt;MetadataDiffViewer&lt;/a&gt; ho dovuto fare i conti con la grande quantità di informazioni da dover processare e dover trovare un modo di rendere l&amp;#39;interfaccia la più utilizzabile possibile. Per prima cosa ho optato per preparare una struttura di assembly/module/type/member tutta in lazy loading, in questo modo solo nell&amp;#39;espandere un assembly vengono caricati i moduli, solo espandendo un modulo vengono caricati i tipi ecc. &lt;b&gt;LINQ&lt;/b&gt; a questo scopo è fantastico perché lavorando con IEnumerable si può parserizzare, incrociare, ordinare, ma elaborare il tutto solo quando viene effettivamente consumato.&lt;/p&gt;
&lt;p&gt;Questo comporta però un difetto perché non mi consente di mostrare preventivamente quali assembly sono cambiati. Ho optato quindi per eseguire in un thread in background e ciclare per la struttura ad oggetti; appena trova un elemento cambiato, l&amp;#39;intero assembly è cambiato e perciò evito di proseguire. Questa operazione era comunque lunga e la cosa meno piacevole era vedere la cpu che lavorava solo al 50%, essendo un dual core.&lt;/p&gt;
&lt;p&gt;Mi son scritto quindi un piccolo extension method, specifico per la mia esigenza, per parallelizzare un&amp;#39;operazione basata su sorgenti LINQ. Il primo problema è determinare quanti core abbiamo a disposizione, ma non potendo accedere all&amp;#39;OS ho ripiegato sul fatto che il thread pool in &lt;b&gt;SL 2.0&lt;/b&gt; ha 250 thread per core e questo numero non si può cambiare. Perciò ho creato una semplice proprietà:&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;private&lt;/span&gt; &lt;span style="color:#0000FF"&gt;const&lt;/span&gt; &lt;span style="color:#0000FF"&gt;int&lt;/span&gt; DefaultThreadsPerCpu = 250;

&lt;span style="color:#0000FF"&gt;public&lt;/span&gt; &lt;span style="color:#0000FF"&gt;static&lt;/span&gt; &lt;span style="color:#0000FF"&gt;int&lt;/span&gt; CpuNumber {
    &lt;span style="color:#0000FF"&gt;get&lt;/span&gt; {
        &lt;span style="color:#0000FF"&gt;int&lt;/span&gt; wt; &lt;span style="color:#0000FF"&gt;int&lt;/span&gt; cpt;
        ThreadPool.GetMaxThreads(&lt;span style="color:#0000FF"&gt;out&lt;/span&gt; wt, &lt;span style="color:#0000FF"&gt;out&lt;/span&gt; cpt);
        &lt;span style="color:#0000FF"&gt;return&lt;/span&gt; Math.Max(1, wt / DefaultThreadsPerCpu);
    }
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;L&amp;#39;extension method che ho poi definito accetta una sorgente dati sul quale ciclare e un delegate ad una funzione che elabora ogni item ed eventualmente restituisce un risultato:&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;public&lt;/span&gt; &lt;span style="color:#0000FF"&gt;static&lt;/span&gt; IEnumerable&amp;lt;tresult&amp;gt; ForEach&amp;lt;IEnumerable&amp;lt;T&amp;gt;, TItem, TResult&amp;gt;
                                   (&lt;span style="color:#0000FF"&gt;this&lt;/span&gt; IEnumerable&amp;lt;T&amp;gt; source, Func&amp;lt;TItem, TResult&amp;gt; process)
{
{&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Per prima cosa ho ripartito la sorgente in n parti, quante sono le cpu, incrociando gli item. Ad esempio su due core al primo vanno l&amp;#39;item 1,3,5.., al secondo vanno 2,4,6.&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;int&lt;/span&gt; cpuNumber = CpuNumber;

&lt;span style="color:#008000"&gt;// Elementi da processare per ogni cpu&lt;/span&gt;
IEnumerable&amp;lt;TItem&amp;gt;[] items = &lt;span style="color:#0000FF"&gt;new&lt;/span&gt; IEnumerable&amp;lt;TItem&amp;gt;[cpuNumber];
&lt;span style="color:#008000"&gt;// Semafori di notifica per ogni cpu&lt;/span&gt;
ManualResetEvent[] events = &lt;span style="color:#0000FF"&gt;new&lt;/span&gt; ManualResetEvent[cpuNumber];
&lt;span style="color:#008000"&gt;// Risultati ottenuti per ogni cpu&lt;/span&gt;
IList&amp;lt;TResult&amp;gt;[] results = &lt;span style="color:#0000FF"&gt;new&lt;/span&gt; IList&amp;lt;TResult&amp;gt;[cpuNumber];

&lt;span style="color:#0000FF"&gt;int&lt;/span&gt; itemsPerCpu = (&lt;span style="color:#0000FF"&gt;int&lt;/span&gt;)Math.Ceiling(source.Count() / (&lt;span style="color:#0000FF"&gt;double&lt;/span&gt;)cpuNumber);

&lt;span style="color:#0000FF"&gt;for&lt;/span&gt; (&lt;span style="color:#0000FF"&gt;int&lt;/span&gt; x = 0; x &amp;lt; items.Length; x++)
{
    items[x] = &lt;span style="color:#0000FF"&gt;new&lt;/span&gt; TItem[itemsPerCpu];
    &lt;span style="color:#0000FF"&gt;int&lt;/span&gt; cpu = x;
    &lt;span style="color:#008000"&gt;// Ripartizione incrociata&lt;/span&gt;
    items[x] = source.Where((item, index) =&amp;gt; (index + cpu) % cpuNumber == 0);
}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;L&amp;#39;uso della variabile interna cpu che semplicemente ricopia x è fondamentale perché all&amp;#39;atto del consumo di items[] x sarebbe sempre all&amp;#39;ultimo valore. Usando LINQ occorre infatti ricordarsi che l&amp;#39;elaborazione avviene a posteriori, a meno non si chiami un ToList/ToArray.&lt;/p&gt;
&lt;p&gt;A questo punto avvio i thread e aspetto tramite un WaitHandle che questi abbiamo finito di lavorare:&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;for&lt;/span&gt; (&lt;span style="color:#0000FF"&gt;int&lt;/span&gt; x = 0; x &amp;lt; items.Length; x++)
{
    &lt;span style="color:#008000"&gt;// Semaforo di notifica al thread che ha lanciato ForEach&lt;/span&gt;
    events[x] = &lt;span style="color:#0000FF"&gt;new&lt;/span&gt; ManualResetEvent(&lt;span style="color:#0000FF"&gt;false&lt;/span&gt;);
    results[x] = &lt;span style="color:#0000FF"&gt;new&lt;/span&gt; List&amp;lt;TResult&amp;gt;(itemsPerCpu);
    Thread t = &lt;span style="color:#0000FF"&gt;new&lt;/span&gt; Thread(&lt;span style="color:#0000FF"&gt;delegate&lt;/span&gt;(&lt;span style="color:#0000FF"&gt;object&lt;/span&gt; i)
    {
        &lt;span style="color:#0000FF"&gt;int&lt;/span&gt; index = (&lt;span style="color:#0000FF"&gt;int&lt;/span&gt;)i;

        &lt;span style="color:#0000FF"&gt;foreach&lt;/span&gt; (TItem item &lt;span style="color:#0000FF"&gt;in&lt;/span&gt; items[index])
            results[index].Add(process(item));

        events[index].Set();
    });
    t.Start(x);
}

WaitHandle.WaitAll(events);&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;I risultati sono un List che poi vengono restituiti, in questo caso non nello stesso ordine della sorgente. Tutto questo per la mia esigenza, ma le variabili possono essere tante, in funzione della sorgente (può non essere possibile dividere il carico in quel modo), o del risultato (certi risultati dipendono dai risultati degli altri thread), ma è un inizio. L&amp;#39;uso poi è molto semplice:&lt;/p&gt;
&lt;div class="codeboxheader"&gt; &lt;/div&gt;&lt;div class="codebox"&gt;&lt;pre&gt;var r = from n &lt;span style="color:#0000FF"&gt;in&lt;/span&gt; Enumerable.Range(1, 1000)
     select &amp;quot;&lt;span style="color:#8B0000"&gt;Ciao &lt;/span&gt;&amp;quot; + n;
&lt;span style="color:#0000FF"&gt;int&lt;/span&gt; l = r.ForEach(s =&amp;gt; s.Length).Sum();&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&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/LINQ/" rel="tag"&gt;LINQ&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/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>.NET, .NET Framework 3.5, LINQ, Silverlight, Silverlight 2.0, XAML</category><guid isPermaLink="true">http://blogs.aspitalia.com/ricciolo/post2487/Parallelizzare-Silverlight-2.0.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2487/Parallelizzare-Silverlight-2.0.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2487.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2487</trackback:ping></item><item><title>LINQ to Reflection - Parte tre</title><link>http://blogs.aspitalia.com/ricciolo/post2486/LINQ-Reflection-Parte.aspx</link><pubDate>Mon, 20 Apr 2009 05:17:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2486' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Ho avuto un po' di tempo per fare alcune aggiunte alla libreria che ora è disponibile nel &lt;a href="http://lab.aspitalia.com/58/MetadataDiffViewer-Differenze-Framework.aspx"&gt;lab&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Ho aggiunto una classe &lt;strong&gt;DTOCopy&amp;lt;Tsource,TTarget&amp;gt;&lt;/strong&gt; che mi permette di memorizzare&amp;#xa0;attraverso un membro statico le proprietà che hanno in comune due classi. L'uso di una classe generica mi permette di avere un meccanismo automatico di cache in funzione delle classi che fanno da source e da target. Lo scopo è creare un extension method &lt;strong&gt;CopyTo&amp;#xa0;&lt;/strong&gt;per copiare i valori da una classe ad un'altra, utile nei DTO:&lt;/p&gt;&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;public&lt;/span&gt; &lt;span style="color:#0000FF"&gt;class&lt;/span&gt; ProductDTO{&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000FF"&gt;public&lt;/span&gt; ProductDTO()&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#0000FF"&gt;public&lt;/span&gt; ProductDTO(Product source)&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color:#008000"&gt;// Copia solo le propriet&amp;#224; che hanno in comune&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; source.CopyTo(this);&amp;#160;&amp;#160;&amp;#160; }&amp;#160;&amp;#160;&amp;#160; public string Description { get; set; }}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;&lt;p&gt;Un secondo extension method invece permette di creare un expression linq per un object initializer di una classe DTO. Siccome mi capita spesso di avere un'entità LINQ to SQL o LINQ to Entities e nell'espressione LINQ voglio avere come risultato una classe DTO, mi son fatto un extension method che mi evita di elencare tutte le proprietà da travasare:&lt;/p&gt;&lt;p&gt;&lt;div class="codeboxheader"&gt; &lt;/div&gt;&lt;div class="codebox"&gt;&lt;pre&gt;&lt;span style="color:#008000"&gt;// Espressione LINQ per DTOIQueryable&amp;lt;Product,ProductDTO&amp;gt; products = new Product[] { new Product { Description = &amp;quot;ppp&amp;quot; } }.AsQueryable();IEnumerable&amp;lt;ProductDTO&amp;gt; productsDTO = products.SelectDTO&amp;lt;Product,ProductDTO&amp;gt;();&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;&lt;p&gt;Decisamente comodo :-)&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/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>Cristian "Ricciolo" Civera</dc:creator><category>.NET 3.5, .NET Framework, .NET Framework 3.5, .NET Framework 4.0, LINQ</category><guid isPermaLink="true">http://blogs.aspitalia.com/ricciolo/post2486/LINQ-Reflection-Parte.aspx</guid><slash:comments>1</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2486/LINQ-Reflection-Parte.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2486.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2486</trackback:ping></item><item><title>Silverlight: performance dell'isolated storage</title><link>http://blogs.aspitalia.com/ricciolo/post2484/Silverlight-Performance-Isolated-Storage.aspx</link><pubDate>Thu, 16 Apr 2009 17:03:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2484' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;Durante lo sviluppo del &lt;a href="http://blogs.aspitalia.com/ricciolo/post2483/metadatadiffviewer-differenze-framework.aspx"&gt;MetadataDiffViewer&lt;/a&gt; ho dovuto ricorrere all'uso dell'Isolated Storage per salvare i metadati in locale e poterli prelevare da disco invece che da remoto. Ho notato però che le performance, rispetto allo scaricare da un webserver in locale, erano peggiori ed era imputabile a:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;la chiamata a&lt;strong&gt; IsolatedStorageFile.GetUserStoreForApplication/Site&lt;/strong&gt;: è molto costosa, aprendo lo storage una sola volta, dall'inizio alla fine ho guadagnato un 40% di performance; &lt;/li&gt;&lt;li&gt;la lettura dello stream attraverso &lt;strong&gt;IsolatedStorageFileStream&lt;/strong&gt;: è un più lenta rispetto ad uno stream in memoria nelle operazioni di accesso randomico. Questo è ovvio visto che va su disco, ma non pensavo così tanto. Precaricando il tutto in un MemoryStream e parserizzando poi l'XML con XDocument.Load in un'attività, ho guadagnato 3 secondi su 14 e non è poco. &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Insomma, occhio a come lo usate.&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_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>.NET, Silverlight, Silverlight 2.0, Silverlight 3.0, XAML</category><guid isPermaLink="true">http://blogs.aspitalia.com/ricciolo/post2484/Silverlight-Performance-Isolated-Storage.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2484/Silverlight-Performance-Isolated-Storage.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2484.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2484</trackback:ping></item><item><title>MetadataDiffViewer: differenze tra i framework</title><link>http://blogs.aspitalia.com/ricciolo/post2483/MetadataDiffViewer-Differenze-Framework.aspx</link><pubDate>Wed, 15 Apr 2009 16:56:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2483' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;&lt;a href="http://lab.ricciolo.aspitalia.com/metadatadiffviewer/metadatadiffviewer.html"&gt;MetadataDiffViewer&lt;/a&gt; è un'applicazione in &lt;strong&gt;Silverlight&lt;/strong&gt; che mostra le differenze in termini di assembly/module/type/member tra una versione del .NET Framework e l'altra. Semplicemente mostra alcune informazioni precalcolate per conoscere nel dettaglio cosa c'è di nuovo in una nuova versione.&lt;/p&gt; &lt;p&gt;Ecco uno screenshot:&lt;/p&gt; &lt;p&gt;&lt;a href="http://blogs.aspitalia.com/img/ricciolo/metadatadiffviewerdifferenzetraiframewor_d943/metadatadiffviewer_4.jpg"&gt;&lt;img title="metadatadiffviewer" border="0" alt="metadatadiffviewer" src="http://blogs.aspitalia.com/img/ricciolo/metadatadiffviewerdifferenzetraiframewor_d943/metadatadiffviewer_thumb_1.jpg" width="340" height="295" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;Lo potete provare &lt;a href="http://lab.ricciolo.aspitalia.com/metadatadiffviewer/metadatadiffviewer.html"&gt;qua&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Non so voi, ma mi dà fastidio essermi perso un nuovo membro. Con questo tool non ci sono più scuse :-)&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Come funziona?&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Ho innanzitutto creato un addin per &lt;strong&gt;Reflector&lt;/strong&gt; così da poter esportare i metadati pubblici degli assembly. La reflection classica non permette di caricare più versione del framework e in un'ottica continua nel tempo ho deciso di esportare i metadati e tenerli sempre pronti. Una console application poi li compara e crea un file di differenze. I metadati e le differenze sono file XML di discreta dimensione perciò, per non riscaricare tutte le informazioni ogni volta, ho deciso di salvare le informazioni nell'isolated storage. Per tenersi il tutto servono circa 60MB (tranquilli, sono zippati quando si scaricano).&lt;/p&gt; &lt;p&gt;I framework comparati che sono a disposizione sono:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Silverlight 2.0 -&amp;gt; Silverlight 3.0 &lt;/li&gt; &lt;li&gt;.NET Framework 1.1 -&amp;gt; .NET Framework 2.0 &lt;/li&gt; &lt;li&gt;.NET Framework 2.0 -&amp;gt; .NET Framework 3.5 &lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Se avete problemi o consigli, &lt;a href="mailto:cristian@aspitalia.com"&gt;scrivetemi&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_2.0/" rel="tag"&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.0/" rel="tag"&gt;.NET Framework 3.0&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/Silverlight/" rel="tag"&gt;Silverlight&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>.NET, .NET Framework, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5, Silverlight, Silverlight 2.0, Silverlight 3.0, XAML</category><guid isPermaLink="true">http://blogs.aspitalia.com/ricciolo/post2483/MetadataDiffViewer-Differenze-Framework.aspx</guid><slash:comments>4</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2483/MetadataDiffViewer-Differenze-Framework.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2483.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2483</trackback:ping></item><item><title>Documentazione MSDN e versioni del .NET Framework</title><link>http://blogs.aspitalia.com/ricciolo/post2482/Documentazione-MSDN-Versioni-.NET-Framework.aspx</link><pubDate>Wed, 15 Apr 2009 13:23:00 GMT</pubDate><description>&lt;img src='http://blogs.aspitalia.com/services/counter_rss.aspx?PostID=2482' border="0" style="width:1px; height:1px;" /&gt;&lt;p&gt;In questo post qualcosa di poco tecnologico, ma che mi segno per me e magari anche voi, per trovare velocemente la documentazione delle classi. Le versioni del framework sono infatti ormai tante: .NET Framework 1.0 - 1.1 - 2.0 - 3.5 e Silverlight 2.0 - 3.0.&lt;/p&gt;&lt;p&gt;Cercando nei motori di ricerca per esempio system.string probabilmente troveremo il link a:&lt;/p&gt;&lt;p&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/system.string.aspx" href="http://msdn.microsoft.com/en-us/library/system.string.aspx"&gt;http://msdn.microsoft.com/en-us/library/system.string.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;che ci porta alla documentazione riferita alla versione attuale: la 3.5.&lt;/p&gt;&lt;p&gt;Mettendo tra parentesi dopo system.string la versione possiamo però distinguere e forzatamente guardare uno specifico framework. Per Silverlight 3.0 per esempio è:&lt;/p&gt;&lt;p&gt;&lt;a title="http://msdn.microsoft.com/en-us/library/system.string(vs.96).aspx" href="http://msdn.microsoft.com/en-us/library/system.string(vs.96).aspx"&gt;http://msdn.microsoft.com/en-us/library/system.string(vs.96).aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Ecco un riassunto delle versioni:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;vs.71: 1.1 &lt;/li&gt;&lt;li&gt;vs.80: 2.0 &lt;/li&gt;&lt;li&gt;vs.85: 3.0 &lt;/li&gt;&lt;li&gt;vs.90: 3.5 &lt;/li&gt;&lt;li&gt;vs.95: SL 2.0 &lt;/li&gt;&lt;li&gt;vs.96: SL 3.0 &lt;/li&gt;&lt;/ul&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_2.0/" rel="tag"&gt;.NET Framework 2.0&lt;/a&gt;, &lt;a href="http://tags.aspitalia.com/.NET_Framework_3.0/" rel="tag"&gt;.NET Framework 3.0&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/Silverlight/" rel="tag"&gt;Silverlight&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>.NET, .NET Framework, .NET Framework 2.0, .NET Framework 3.0, .NET Framework 3.5, Silverlight, Silverlight 2.0, Silverlight 3.0, XAML</category><guid isPermaLink="true">http://blogs.aspitalia.com/ricciolo/post2482/Documentazione-MSDN-Versioni-.NET-Framework.aspx</guid><slash:comments>0</slash:comments><wfw:comment>http://blogs.aspitalia.com/ricciolo/post2482/Documentazione-MSDN-Versioni-.NET-Framework.aspx#feedback</wfw:comment><wfw:commentRss>http://blogs.aspitalia.com/ricciolo/CommentRSS2482.aspx</wfw:commentRss><trackback:ping>http://blogs.aspitalia.com/services/trackback.aspx?PostID=2482</trackback:ping></item></channel></rss>