<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Exam 70-536 Application Development Foundation</title>
        <link>http://blogs.ugidotnet.org/angellaa/category/Exam 70-536 Application Development Foundation.aspx</link>
        <description>Exam 70-536 Application Development Foundation</description>
        <language>it-IT</language>
        <copyright>Andrea Angella</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>[70-536] GZipStream class, DeflateStream class and Isolated Storage</title>
            <link>http://blogs.ugidotnet.org/angellaa/archive/2008/11/18/70-536-gzipstream-class-deflatestream-class-and-isolated-storage.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;Area di riferimento&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;- Implementing serialization and input/output functionality in a .NET Framework application (18 percent)    &lt;br /&gt;   - Compress or decompress stream information in a .NET Framework application and improve the security of application data by using isolated storage     &lt;br /&gt;      - May include but is not limited to: IsolatedStorageFile class, IsolatedStorageFileStream class;     &lt;br /&gt;      - DeflateStream class; GZipStream class &lt;/p&gt;  &lt;p /&gt;  &lt;hr /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;GZipStream and DeflateStream classes&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;La classi &lt;strong&gt;GZipStream&lt;/strong&gt; e &lt;strong&gt;DeflateStream&lt;/strong&gt; permettono di comprimere dati utilizzando il famoso algoritmo di compressione Gzip. Conviene utilizzare la classe GZipStream nel caso in cui si intenda distribuire i file in modo che questi possano essere decompressi utilizzando l'ampiamente diffuso tool gzip.&lt;/p&gt;  &lt;p&gt;Queste classi si trovano nel namespace &lt;strong&gt;System.IO.Compression&lt;/strong&gt; e il loro utilizzo è molto semplice.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font /&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:d2be8732-e07e-4ee1-a376-323d0c8ceebb" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:WhiteSmoke;;overflow: none;;font-family:Consolas;font-size:12"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #000000; "&gt;    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;class&lt;/span&gt;&lt;span style="color: #000000; "&gt; Program
    {
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;static&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; Main(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt;[] args)
        {
            File.WriteAllText(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;source.txt&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Il contenuto di questo file verra' compresso.&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);

            &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; File compression&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;using&lt;/span&gt;&lt;span style="color: #000000; "&gt; (FileStream sourceFile &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; File.Open(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;source.txt&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, FileMode.Open))
            {
                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;using&lt;/span&gt;&lt;span style="color: #000000; "&gt; (FileStream destinationFile &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; File.Open(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;destination.dat&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, FileMode.Create))
                {
                    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;using&lt;/span&gt;&lt;span style="color: #000000; "&gt; (GZipStream comp &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; GZipStream(destinationFile, CompressionMode.Compress))
                    {
                        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; b;
                        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;while&lt;/span&gt;&lt;span style="color: #000000; "&gt; ((b &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; sourceFile.ReadByte()) &lt;/span&gt;&lt;span style="color: #000000; "&gt;!=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;-&lt;/span&gt;&lt;span style="color: #000000; "&gt;1&lt;/span&gt;&lt;span style="color: #000000; "&gt;)
                        {
                            comp.WriteByte((&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;byte&lt;/span&gt;&lt;span style="color: #000000; "&gt;)b);
                        }
                    }
                }
            }  
         
            &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; File decompression&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;using&lt;/span&gt;&lt;span style="color: #000000; "&gt; (FileStream sourceFile &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; File.Open(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;destination.dat&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, FileMode.Open))
            {
                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;using&lt;/span&gt;&lt;span style="color: #000000; "&gt; (FileStream destinationFile &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; File.Open(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;new-source.txt&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, FileMode.Create))
                {
                    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;using&lt;/span&gt;&lt;span style="color: #000000; "&gt; (GZipStream decomp &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; GZipStream(sourceFile, CompressionMode.Decompress))
                    {
                        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; b;
                        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;while&lt;/span&gt;&lt;span style="color: #000000; "&gt; ((b &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; decomp.ReadByte()) &lt;/span&gt;&lt;span style="color: #000000; "&gt;!=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;-&lt;/span&gt;&lt;span style="color: #000000; "&gt;1&lt;/span&gt;&lt;span style="color: #000000; "&gt;)
                        {
                            destinationFile.WriteByte((&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;byte&lt;/span&gt;&lt;span style="color: #000000; "&gt;)b);
                        }
                    }
                }
            }

            Console.WriteLine(File.ReadAllText(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;new-source.txt&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;));
            Console.ReadKey();
        }
    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;&lt;font size="3" /&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font size="3" /&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;font&gt;Isolated Storage&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;L'Isolated Storage è un repository all'interno del quale è possibile leggere e scrivere dati in maniera sicura indipendentemente dai privilegi di cui disponde il codice.&lt;/p&gt;

&lt;p&gt;La prima cosa da fare quando si lavora con l'isolated storage è scegliere l'ambito in cui saranno memorizzati i dati:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Assembly/Machine&lt;/strong&gt; : Si utilizza questo ambito per persistere dati a livello di applicazione. &lt;/li&gt;

  &lt;li&gt;&lt;strong&gt;Assembly/User&lt;/strong&gt; : Si utilizza questo ambito per persistere dati a livello di utente. Ogni utente della macchina avrà le sue impostazioni specifiche. &lt;/li&gt;

  &lt;li&gt;... &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L'utilizzo dell'Isolated Storage ruota intorno alle classi &lt;strong&gt;IsolatedStorageFile&lt;/strong&gt; e &lt;strong&gt;IsolatedStorageFileStream&lt;/strong&gt;. E' inoltre possibile utilizzare l'attributo &lt;strong&gt;IsolatedStorageFilePermission&lt;/strong&gt; per specificare il permesso di accedere all'Isolated Storage e impostare altri parametri come ad esempio la quota massima di spazio da associare a ciascun utente.&lt;/p&gt;

&lt;p&gt; &lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E6:6fa3d32c-655a-4995-b5d3-e1116232121a" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:WhiteSmoke;;overflow: none;;font-family:Consolas;font-size:12"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #000000; "&gt;    [IsolatedStorageFilePermission(SecurityAction.Demand, UserQuota&lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt;256&lt;/span&gt;&lt;span style="color: #000000; "&gt;)]
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;class&lt;/span&gt;&lt;span style="color: #000000; "&gt; Program
    {
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;static&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; Main(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt;[] args)
        {
            &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Assembly/Machine Scope - Writing data&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;
            IsolatedStorageFile applicationStorage &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; IsolatedStorageFile.GetMachineStoreForAssembly();

            IsolatedStorageFileStream applicationStream &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; 
                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; IsolatedStorageFileStream(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;application-settings.dat&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, FileMode.Create, applicationStorage);

            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;using&lt;/span&gt;&lt;span style="color: #000000; "&gt; (StreamWriter writer &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; StreamWriter(applicationStream))
            {
                writer.Write(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Informazioni a livello applicazione&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
            }

            &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; User/Machine Scope - Writing data&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;
            IsolatedStorageFile userStorage &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; IsolatedStorageFile.GetUserStoreForAssembly();

            IsolatedStorageFileStream userStream &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt;
                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; IsolatedStorageFileStream(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;user-settings.dat&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, FileMode.Create, userStorage);

            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;using&lt;/span&gt;&lt;span style="color: #000000; "&gt; (StreamWriter writer &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; StreamWriter(userStream))
            {
                writer.Write(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Informazioni a livello utente in user-settings.dat&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
            }

            userStorage.CreateDirectory(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;folder&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);

            userStream &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; IsolatedStorageFileStream(&lt;/span&gt;&lt;span style="color: #000000; "&gt;@"&lt;/span&gt;&lt;span style="color: #000000; "&gt;folder\user-settings.dat&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, FileMode.Create, userStorage);

            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;using&lt;/span&gt;&lt;span style="color: #000000; "&gt; (StreamWriter writer &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; StreamWriter(userStream))
            {
                writer.Write(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Informazioni a livello utente in folder\\user-settings.dat&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
            }

            &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Reading data&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;
            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Directories :&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;foreach&lt;/span&gt;&lt;span style="color: #000000; "&gt; (&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; directory &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;in&lt;/span&gt;&lt;span style="color: #000000; "&gt; userStorage.GetDirectoryNames(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;*&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;))
            {
                Console.WriteLine(directory);
            }

            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Files *.dat :&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;foreach&lt;/span&gt;&lt;span style="color: #000000; "&gt; (&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; file &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;in&lt;/span&gt;&lt;span style="color: #000000; "&gt; userStorage.GetFileNames(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;*.dat&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;))
            {
                Console.WriteLine(file);
            }

            Console.ReadKey();
        }
    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;&lt;img src="http://blogs.ugidotnet.org/angellaa/aggbug/94686.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Angella</dc:creator>
            <guid>http://blogs.ugidotnet.org/angellaa/archive/2008/11/18/70-536-gzipstream-class-deflatestream-class-and-isolated-storage.aspx</guid>
            <pubDate>Tue, 18 Nov 2008 15:07:17 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/angellaa/archive/2008/11/18/70-536-gzipstream-class-deflatestream-class-and-isolated-storage.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/angellaa/comments/commentRss/94686.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/angellaa/services/trackbacks/94686.aspx</trackback:ping>
        </item>
        <item>
            <title>[70-536] - File System classes and Streams</title>
            <link>http://blogs.ugidotnet.org/angellaa/archive/2008/11/18/70-536-file-system-classes-and-streams.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;Area di riferimento&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;- Implementing serialization and input/output functionality in a .NET Framework application (18 percent)    &lt;br /&gt;   - Access files and folders by using the File System classes     &lt;br /&gt;      - May include but is not limited to: File class and FileInfo class; Directory class and DirectoryInfo class;     &lt;br /&gt;      - DriveInfo class and DriveType enumeration; FileSystemInfo class and FileSystemWatcher class; Path class;     &lt;br /&gt;      - ErrorEventArgs class and ErrorEventHandler delegate; RenamedEventArgs class and RenamedEventHandler delegate     &lt;br /&gt;   - Manage byte streams by using Stream classes     &lt;br /&gt;      - May include but is not limited to: FileStream class; Stream class; MemoryStream; BufferedStream class     &lt;br /&gt;   - Manage .NET Framework application data by using Reader and Writer classes     &lt;br /&gt;      - May include but is not limited to: StringReader class and StringWriter class; TextReader class and TextWriter class;     &lt;br /&gt;      - StreamReader class and Stream Writer class; BinaryReader class and BinaryWriter class&lt;/p&gt;  &lt;p /&gt;  &lt;hr /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;File System classes&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Il framework .NET offre numerose classi che permettono l'accesso al file system.&lt;/p&gt;  &lt;p&gt;La classe &lt;strong&gt;DriveInfo&lt;/strong&gt; permette di ottenere informazioni relative ai drive presenti sulla macchina. La classe &lt;strong&gt;File&lt;/strong&gt; permette di effettuare alcune tipiche operazioni sui file come la copia, la creazione e la cancellazione. Le classi &lt;strong&gt;FileInfo&lt;/strong&gt; e &lt;strong&gt;DirectoryInfo&lt;/strong&gt; derivano da &lt;strong&gt;FileSystemInfo&lt;/strong&gt; e consentono di accedere a diverse informazioni relative a file e directory. Utilizzando queste classi inoltre è estremamente semplice navigare attraverso il file system ottenendo l'elenco dei file presenti all'interno di una directory e l'elenco di directory presenti all'interno di un'altra directory. La classe &lt;strong&gt;Path&lt;/strong&gt; fornisce un valido supporto per estrapolare informazioni relative ad un path e soprattutto offre una comoda funzione per combinare due path fra loro.&lt;/p&gt;  &lt;p&gt;Grazie all'interessantissima classe &lt;strong&gt;FileSystemWatcher&lt;/strong&gt; è inoltre possibile monitorare in tempo reale le modifiche che vengono compiute all'interno di una particolare cartella semplicemente gestendo opportuni eventi.&lt;/p&gt;  &lt;p&gt;Di seguito riporto un pò di codice che utilizza tutte queste classi. Il loro utilizzo è molto intuitivo per questo non ritengo necessaria alcuna ulteriore spiegazione.&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:afec56a6-171e-4861-9fd6-6369f65e1682" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:WhiteSmoke;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;;overflow: auto;;font-family:Consolas;font-size:12"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #008080; "&gt;  1&lt;/span&gt; &lt;span style="color: #000000; "&gt;    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;class&lt;/span&gt;&lt;span style="color: #000000; "&gt; Program
&lt;/span&gt;&lt;span style="color: #008080; "&gt;  2&lt;/span&gt; &lt;span style="color: #000000; "&gt;    {
&lt;/span&gt;&lt;span style="color: #008080; "&gt;  3&lt;/span&gt; &lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;static&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; Main(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt;[] args)
&lt;/span&gt;&lt;span style="color: #008080; "&gt;  4&lt;/span&gt; &lt;span style="color: #000000; "&gt;        {
&lt;/span&gt;&lt;span style="color: #008080; "&gt;  5&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Drive\n&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;  6&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt;  7&lt;/span&gt; &lt;span style="color: #000000; "&gt;            DriveInfo driveInfo &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; DriveInfo(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;C&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;  8&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Name: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, driveInfo.Name);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;  9&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;TotalSize: {0} bytes&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, driveInfo.TotalSize);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 10&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;TotalFreeSpace: {0} bytes&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, driveInfo.TotalFreeSpace);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 11&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;AvailableFreeSpace: {0} bytes&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, driveInfo.AvailableFreeSpace);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 12&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;DriveFormat: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, driveInfo.DriveFormat);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 13&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;DriveType: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, driveInfo.DriveType);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 14&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;VolumeLabel: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, driveInfo.VolumeLabel);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 15&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 16&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;\nFile:\n&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 17&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 18&lt;/span&gt; &lt;span style="color: #000000; "&gt;            File.AppendAllText(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;file1.txt&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Ciao a tutti da Andrea&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, Encoding.ASCII);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 19&lt;/span&gt; &lt;span style="color: #000000; "&gt;            File.Copy(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;file1.txt&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;file2.txt&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;true&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 20&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 21&lt;/span&gt; &lt;span style="color: #000000; "&gt;            FileInfo file2Info &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; FileInfo(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;file2.txt&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 22&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;CreationTime: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, file2Info.CreationTime);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 23&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;LastWriteTime: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, file2Info.LastWriteTime);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 24&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;DirectoryName: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, file2Info.DirectoryName);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 25&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Exists: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, file2Info.Exists);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 26&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Extension: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, file2Info.Extension);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 27&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;FullName: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, file2Info.FullName);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 28&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Name: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, file2Info.Name);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 29&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;IsReadOnly: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, file2Info.IsReadOnly);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 30&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Length: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, file2Info.Length);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 31&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 32&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;\nDirectory:\n&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 33&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 34&lt;/span&gt; &lt;span style="color: #000000; "&gt;            DirectoryInfo dir2Info &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; file2Info.Directory;
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 35&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;CreationTime: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, dir2Info.CreationTime);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 36&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;FullTime: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, dir2Info.FullName);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 37&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Exists: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, dir2Info.Exists);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 38&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;LastAccessTime: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, dir2Info.LastAccessTime);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 39&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;LastWriteTime: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, dir2Info.LastWriteTime);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 40&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 41&lt;/span&gt; &lt;span style="color: #000000; "&gt;            dir2Info.CreateSubdirectory(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;folder1&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 42&lt;/span&gt; &lt;span style="color: #000000; "&gt;            dir2Info.CreateSubdirectory(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;folder2&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 43&lt;/span&gt; &lt;span style="color: #000000; "&gt;            dir2Info.CreateSubdirectory(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;folder3&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 44&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 45&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Files in folder: &lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 46&lt;/span&gt; &lt;span style="color: #000000; "&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;foreach&lt;/span&gt;&lt;span style="color: #000000; "&gt; (FileInfo fileInfo &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;in&lt;/span&gt;&lt;span style="color: #000000; "&gt; dir2Info.GetFiles())
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 47&lt;/span&gt; &lt;span style="color: #000000; "&gt;            {
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 48&lt;/span&gt; &lt;span style="color: #000000; "&gt;                Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;\t{0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, file2Info.Name);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 49&lt;/span&gt; &lt;span style="color: #000000; "&gt;            }
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 50&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 51&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Directory in folder: &lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 52&lt;/span&gt; &lt;span style="color: #000000; "&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;foreach&lt;/span&gt;&lt;span style="color: #000000; "&gt; (DirectoryInfo dirInfo &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;in&lt;/span&gt;&lt;span style="color: #000000; "&gt; dir2Info.GetDirectories())
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 53&lt;/span&gt; &lt;span style="color: #000000; "&gt;            {
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 54&lt;/span&gt; &lt;span style="color: #000000; "&gt;                Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;\t{0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, dirInfo.Name);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 55&lt;/span&gt; &lt;span style="color: #000000; "&gt;            }
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 56&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 57&lt;/span&gt; &lt;span style="color: #000000; "&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;if&lt;/span&gt;&lt;span style="color: #000000; "&gt; (Directory.Exists(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;folder1&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;))
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 58&lt;/span&gt; &lt;span style="color: #000000; "&gt;            {
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 59&lt;/span&gt; &lt;span style="color: #000000; "&gt;                Directory.Delete(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;folder1&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 60&lt;/span&gt; &lt;span style="color: #000000; "&gt;            }
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 61&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Directory.Delete(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;folder2&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 62&lt;/span&gt; &lt;span style="color: #000000; "&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; DirectoryInfo(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;folder3&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;).Delete();
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 63&lt;/span&gt; &lt;span style="color: #000000; "&gt;            file2Info.Delete();
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 64&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 65&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;\nPath: c:\\prova\\file.txt \n&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 66&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;GetDirectoryName: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, Path.GetDirectoryName(&lt;/span&gt;&lt;span style="color: #000000; "&gt;@"&lt;/span&gt;&lt;span style="color: #000000; "&gt;c:\prova\file.txt&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;));
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 67&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;GetExtension: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, Path.GetExtension(&lt;/span&gt;&lt;span style="color: #000000; "&gt;@"&lt;/span&gt;&lt;span style="color: #000000; "&gt;c:\prova\file.txt&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;));
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 68&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;GetFileName: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, Path.GetFileName(&lt;/span&gt;&lt;span style="color: #000000; "&gt;@"&lt;/span&gt;&lt;span style="color: #000000; "&gt;c:\prova\file.txt&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;));
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 69&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;GetFileNameWithoutExtension: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, Path.GetFileNameWithoutExtension(&lt;/span&gt;&lt;span style="color: #000000; "&gt;@"&lt;/span&gt;&lt;span style="color: #000000; "&gt;c:\prova\file.txt&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;));
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 70&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;GetFullPath: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, Path.GetFullPath(&lt;/span&gt;&lt;span style="color: #000000; "&gt;@"&lt;/span&gt;&lt;span style="color: #000000; "&gt;c:\prova\file.txt&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;));
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 71&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;GetPathRoot: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, Path.GetPathRoot(&lt;/span&gt;&lt;span style="color: #000000; "&gt;@"&lt;/span&gt;&lt;span style="color: #000000; "&gt;c:\prova\file.txt&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;));
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 72&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;GetRandomFileName: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, Path.GetRandomFileName());
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 73&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;GetTempPath: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, Path.GetTempPath());
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 74&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;GetTempFileName: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, Path.GetTempFileName());
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 75&lt;/span&gt; &lt;span style="color: #000000; "&gt;       
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 76&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Combine: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, Path.Combine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;c:\\prova1&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;prova2\\file.txt&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;));
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 77&lt;/span&gt; &lt;span style="color: #000000; "&gt;            
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 78&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;\nFileSystemWatcher: \n&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 79&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 80&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Directory.CreateDirectory(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;folder&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 81&lt;/span&gt; &lt;span style="color: #000000; "&gt;            FileSystemWatcher fsWatcher &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; FileSystemWatcher(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;folder&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 82&lt;/span&gt; &lt;span style="color: #000000; "&gt;            fsWatcher.Created &lt;/span&gt;&lt;span style="color: #000000; "&gt;+=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; FileSystemEventHandler(fsWatcher_Created);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 83&lt;/span&gt; &lt;span style="color: #000000; "&gt;            fsWatcher.Deleted &lt;/span&gt;&lt;span style="color: #000000; "&gt;+=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; FileSystemEventHandler(fsWatcher_Deleted);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 84&lt;/span&gt; &lt;span style="color: #000000; "&gt;            fsWatcher.Changed &lt;/span&gt;&lt;span style="color: #000000; "&gt;+=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; FileSystemEventHandler(fsWatcher_Changed);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 85&lt;/span&gt; &lt;span style="color: #000000; "&gt;            fsWatcher.Renamed &lt;/span&gt;&lt;span style="color: #000000; "&gt;+=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; RenamedEventHandler(fsWatcher_Renamed);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 86&lt;/span&gt; &lt;span style="color: #000000; "&gt;            fsWatcher.Error &lt;/span&gt;&lt;span style="color: #000000; "&gt;+=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; ErrorEventHandler(fsWatcher_Error);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 87&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 88&lt;/span&gt; &lt;span style="color: #000000; "&gt;            fsWatcher.EnableRaisingEvents &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;true&lt;/span&gt;&lt;span style="color: #000000; "&gt;;
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 89&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 90&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.ReadKey();
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 91&lt;/span&gt; &lt;span style="color: #000000; "&gt;        }
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 92&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 93&lt;/span&gt; &lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;static&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; fsWatcher_Error(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;object&lt;/span&gt;&lt;span style="color: #000000; "&gt; sender, ErrorEventArgs e)
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 94&lt;/span&gt; &lt;span style="color: #000000; "&gt;        {
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 95&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;FileSystemWatcher Error\n&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 96&lt;/span&gt; &lt;span style="color: #000000; "&gt;        }
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 97&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 98&lt;/span&gt; &lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;static&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; fsWatcher_Changed(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;object&lt;/span&gt;&lt;span style="color: #000000; "&gt; sender, FileSystemEventArgs e)
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 99&lt;/span&gt; &lt;span style="color: #000000; "&gt;        {
&lt;/span&gt;&lt;span style="color: #008080; "&gt;100&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;ChangeType: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, e.ChangeType);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;101&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;FullPath: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, e.FullPath);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;102&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Name: {0}\n&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, e.Name);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;103&lt;/span&gt; &lt;span style="color: #000000; "&gt;        }
&lt;/span&gt;&lt;span style="color: #008080; "&gt;104&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt;105&lt;/span&gt; &lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;static&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; fsWatcher_Renamed(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;object&lt;/span&gt;&lt;span style="color: #000000; "&gt; sender, RenamedEventArgs e)
&lt;/span&gt;&lt;span style="color: #008080; "&gt;106&lt;/span&gt; &lt;span style="color: #000000; "&gt;        {
&lt;/span&gt;&lt;span style="color: #008080; "&gt;107&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;ChangeType: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, e.ChangeType);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;108&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;FullPath: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, e.FullPath);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;109&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Name: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, e.Name);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;110&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;OldFullPath: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, e.OldFullPath);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;111&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;OldName: {0}\n&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, e.OldName);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;112&lt;/span&gt; &lt;span style="color: #000000; "&gt;        }
&lt;/span&gt;&lt;span style="color: #008080; "&gt;113&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt;114&lt;/span&gt; &lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;static&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; fsWatcher_Deleted(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;object&lt;/span&gt;&lt;span style="color: #000000; "&gt; sender, FileSystemEventArgs e)
&lt;/span&gt;&lt;span style="color: #008080; "&gt;115&lt;/span&gt; &lt;span style="color: #000000; "&gt;        {
&lt;/span&gt;&lt;span style="color: #008080; "&gt;116&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;ChangeType: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, e.ChangeType);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;117&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;FullPath: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, e.FullPath);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;118&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Name: {0}\n&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, e.Name);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;119&lt;/span&gt; &lt;span style="color: #000000; "&gt;        }
&lt;/span&gt;&lt;span style="color: #008080; "&gt;120&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt;121&lt;/span&gt; &lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;static&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; fsWatcher_Created(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;object&lt;/span&gt;&lt;span style="color: #000000; "&gt; sender, FileSystemEventArgs e)
&lt;/span&gt;&lt;span style="color: #008080; "&gt;122&lt;/span&gt; &lt;span style="color: #000000; "&gt;        {
&lt;/span&gt;&lt;span style="color: #008080; "&gt;123&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;ChangeType: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, e.ChangeType);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;124&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;FullPath: {0}&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, e.FullPath);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;125&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Name: {0}\n&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, e.Name);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;126&lt;/span&gt; &lt;span style="color: #000000; "&gt;        }
&lt;/span&gt;&lt;span style="color: #008080; "&gt;127&lt;/span&gt; &lt;span style="color: #000000; "&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Streams&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Gli stream realizzano un meccanismo unificato per gestire l'accesso sequenziale e random ai dati. La classe astratta &lt;strong&gt;Stream&lt;/strong&gt; fornisce l'interfaccia di base e l'implementazione per tutti gli strem all'interno del Framework. Quando si apre un file viene restituito un oggetto di tipo &lt;strong&gt;FileStream&lt;/strong&gt; che offre una interfaccia di basso livello per l'accesso al file. Le classi &lt;strong&gt;StreamReader&lt;/strong&gt; e &lt;strong&gt;StreamWriter&lt;/strong&gt; facilitano la lettura e la scrittura di file di testo. Le classi &lt;strong&gt;BinaryReader&lt;/strong&gt; e &lt;strong&gt;BinaryWriter&lt;/strong&gt; invece permettono la lettura e la scrittura di dati binari in modo più semplice del dover lavorare direttamente su vettori di byte.&lt;/p&gt;

&lt;p&gt;Quando si lavora con piccoli file di testo è possibile utilizzare le funzioni &lt;strong&gt;File.WriteAllText&lt;/strong&gt; e &lt;strong&gt;File.ReadAllText&lt;/strong&gt; rispettivamente per scrivere un file di testo a partire da una stringa e per ottenere il contenuto di un file di testo all'interno di una stringa.&lt;/p&gt;

&lt;p&gt;La classe &lt;strong&gt;MemoryStream&lt;/strong&gt; fornisce le funzionalità per creare stream in memoria. Le classi &lt;strong&gt;StringReader&lt;/strong&gt; e &lt;strong&gt;StringWriter&lt;/strong&gt; invece svolgono le stesse funzionalità delle classi StreamReader e StreamWriter solo che la sorgente dati associata è una stringa al contrario di un file ( le classi astratte da cui derivano sono &lt;strong&gt;TextReader&lt;/strong&gt; e &lt;strong&gt;TextWriter&lt;/strong&gt; che implementano le funzionalità di base per la lettura e scrittura di testo).&lt;/p&gt;

&lt;p&gt;Ecco un pò di codice dimostrativo:&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:e5fb8f4e-60a8-45e7-a2bd-5dee8ce38b48" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:WhiteSmoke;;overflow: auto;;font-family:Consolas;font-size:12"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #008080; "&gt; 1&lt;/span&gt; &lt;span style="color: #000000; "&gt;    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;class&lt;/span&gt;&lt;span style="color: #000000; "&gt; Program
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 2&lt;/span&gt; &lt;span style="color: #000000; "&gt;    {
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 3&lt;/span&gt; &lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;static&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; Main(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt;[] args)
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 4&lt;/span&gt; &lt;span style="color: #000000; "&gt;        {
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 5&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;*** Text Streams: ***\n&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 6&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 7&lt;/span&gt; &lt;span style="color: #000000; "&gt;            FileStream fs &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; File.Open(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;file.txt&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, FileMode.Create);
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 8&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt; 9&lt;/span&gt; &lt;span style="color: #000000; "&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;byte&lt;/span&gt;&lt;span style="color: #000000; "&gt;[] bytesTitolo &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; ASCIIEncoding().GetBytes(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Titolo del file\r\n\r\n&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;10&lt;/span&gt; &lt;span style="color: #000000; "&gt;            fs.Write(bytesTitolo, &lt;/span&gt;&lt;span style="color: #000000; "&gt;0&lt;/span&gt;&lt;span style="color: #000000; "&gt;, bytesTitolo.Length);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;11&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt;12&lt;/span&gt; &lt;span style="color: #000000; "&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;using&lt;/span&gt;&lt;span style="color: #000000; "&gt; (StreamWriter sw &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; StreamWriter(fs))
&lt;/span&gt;&lt;span style="color: #008080; "&gt;13&lt;/span&gt; &lt;span style="color: #000000; "&gt;            {
&lt;/span&gt;&lt;span style="color: #008080; "&gt;14&lt;/span&gt; &lt;span style="color: #000000; "&gt;                sw.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Ciao a tutti&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;15&lt;/span&gt; &lt;span style="color: #000000; "&gt;                sw.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;il mio nome Ã¨ Andrea&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;16&lt;/span&gt; &lt;span style="color: #000000; "&gt;            }
&lt;/span&gt;&lt;span style="color: #008080; "&gt;17&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt;18&lt;/span&gt; &lt;span style="color: #000000; "&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;using&lt;/span&gt;&lt;span style="color: #000000; "&gt; (StreamReader sr &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; File.OpenText(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;file.txt&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;))
&lt;/span&gt;&lt;span style="color: #008080; "&gt;19&lt;/span&gt; &lt;span style="color: #000000; "&gt;            {
&lt;/span&gt;&lt;span style="color: #008080; "&gt;20&lt;/span&gt; &lt;span style="color: #000000; "&gt;                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;while&lt;/span&gt;&lt;span style="color: #000000; "&gt; (&lt;/span&gt;&lt;span style="color: #000000; "&gt;!&lt;/span&gt;&lt;span style="color: #000000; "&gt;sr.EndOfStream)
&lt;/span&gt;&lt;span style="color: #008080; "&gt;21&lt;/span&gt; &lt;span style="color: #000000; "&gt;                {
&lt;/span&gt;&lt;span style="color: #008080; "&gt;22&lt;/span&gt; &lt;span style="color: #000000; "&gt;                    Console.WriteLine(sr.ReadLine());
&lt;/span&gt;&lt;span style="color: #008080; "&gt;23&lt;/span&gt; &lt;span style="color: #000000; "&gt;                }
&lt;/span&gt;&lt;span style="color: #008080; "&gt;24&lt;/span&gt; &lt;span style="color: #000000; "&gt;            }
&lt;/span&gt;&lt;span style="color: #008080; "&gt;25&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt;26&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine();
&lt;/span&gt;&lt;span style="color: #008080; "&gt;27&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt;28&lt;/span&gt; &lt;span style="color: #000000; "&gt;            File.WriteAllText(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;file2.txt&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Prima riga del file2\r\nSeconda riga del file2&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;29&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(File.ReadAllText(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;file2.txt&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;));
&lt;/span&gt;&lt;span style="color: #008080; "&gt;30&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt;31&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;\n*** Binary Streams: ***\n&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;32&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt;33&lt;/span&gt; &lt;span style="color: #000000; "&gt;            fs &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; File.Open(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;file3.dat&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, FileMode.Create);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;34&lt;/span&gt; &lt;span style="color: #000000; "&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;using&lt;/span&gt;&lt;span style="color: #000000; "&gt; (BinaryWriter bw &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; BinaryWriter(fs))
&lt;/span&gt;&lt;span style="color: #008080; "&gt;35&lt;/span&gt; &lt;span style="color: #000000; "&gt;            {
&lt;/span&gt;&lt;span style="color: #008080; "&gt;36&lt;/span&gt; &lt;span style="color: #000000; "&gt;                bw.Write(&lt;/span&gt;&lt;span style="color: #000000; "&gt;'&lt;/span&gt;&lt;span style="color: #000000; "&gt;A&lt;/span&gt;&lt;span style="color: #000000; "&gt;'&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;37&lt;/span&gt; &lt;span style="color: #000000; "&gt;                bw.Write(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;true&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;38&lt;/span&gt; &lt;span style="color: #000000; "&gt;                bw.Write(&lt;/span&gt;&lt;span style="color: #000000; "&gt;12.45&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;39&lt;/span&gt; &lt;span style="color: #000000; "&gt;                bw.Write(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Ciao&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;40&lt;/span&gt; &lt;span style="color: #000000; "&gt;            }
&lt;/span&gt;&lt;span style="color: #008080; "&gt;41&lt;/span&gt; &lt;span style="color: #000000; "&gt;            fs &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; File.Open(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;file3.dat&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, FileMode.Open);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;42&lt;/span&gt; &lt;span style="color: #000000; "&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;using&lt;/span&gt;&lt;span style="color: #000000; "&gt; (BinaryReader br &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; BinaryReader(fs))
&lt;/span&gt;&lt;span style="color: #008080; "&gt;43&lt;/span&gt; &lt;span style="color: #000000; "&gt;            {
&lt;/span&gt;&lt;span style="color: #008080; "&gt;44&lt;/span&gt; &lt;span style="color: #000000; "&gt;                Console.WriteLine(br.ReadChar());
&lt;/span&gt;&lt;span style="color: #008080; "&gt;45&lt;/span&gt; &lt;span style="color: #000000; "&gt;                Console.WriteLine(br.ReadBoolean());
&lt;/span&gt;&lt;span style="color: #008080; "&gt;46&lt;/span&gt; &lt;span style="color: #000000; "&gt;                Console.WriteLine(br.ReadDouble());
&lt;/span&gt;&lt;span style="color: #008080; "&gt;47&lt;/span&gt; &lt;span style="color: #000000; "&gt;                Console.WriteLine(br.ReadString());
&lt;/span&gt;&lt;span style="color: #008080; "&gt;48&lt;/span&gt; &lt;span style="color: #000000; "&gt;            }
&lt;/span&gt;&lt;span style="color: #008080; "&gt;49&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt;50&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;\n*** Memory Streams: ***\n&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;51&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt;52&lt;/span&gt; &lt;span style="color: #000000; "&gt;            MemoryStream ms &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; MemoryStream();
&lt;/span&gt;&lt;span style="color: #008080; "&gt;53&lt;/span&gt; &lt;span style="color: #000000; "&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;using&lt;/span&gt;&lt;span style="color: #000000; "&gt; (StreamWriter sw &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; StreamWriter(ms))
&lt;/span&gt;&lt;span style="color: #008080; "&gt;54&lt;/span&gt; &lt;span style="color: #000000; "&gt;            {
&lt;/span&gt;&lt;span style="color: #008080; "&gt;55&lt;/span&gt; &lt;span style="color: #000000; "&gt;                sw.WriteLine(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Scrivo su uno stream in memoria.&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;56&lt;/span&gt; &lt;span style="color: #000000; "&gt;                sw.Flush();
&lt;/span&gt;&lt;span style="color: #008080; "&gt;57&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt;58&lt;/span&gt; &lt;span style="color: #000000; "&gt;                &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;using&lt;/span&gt;&lt;span style="color: #000000; "&gt; (fs &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; File.Open(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;file.txt&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, FileMode.Append))
&lt;/span&gt;&lt;span style="color: #008080; "&gt;59&lt;/span&gt; &lt;span style="color: #000000; "&gt;                {
&lt;/span&gt;&lt;span style="color: #008080; "&gt;60&lt;/span&gt; &lt;span style="color: #000000; "&gt;                    ms.WriteTo(fs);
&lt;/span&gt;&lt;span style="color: #008080; "&gt;61&lt;/span&gt; &lt;span style="color: #000000; "&gt;                }
&lt;/span&gt;&lt;span style="color: #008080; "&gt;62&lt;/span&gt; &lt;span style="color: #000000; "&gt;            }
&lt;/span&gt;&lt;span style="color: #008080; "&gt;63&lt;/span&gt; &lt;span style="color: #000000; "&gt;
&lt;/span&gt;&lt;span style="color: #008080; "&gt;64&lt;/span&gt; &lt;span style="color: #000000; "&gt;            Console.ReadKey();
&lt;/span&gt;&lt;span style="color: #008080; "&gt;65&lt;/span&gt; &lt;span style="color: #000000; "&gt;        }
&lt;/span&gt;&lt;span style="color: #008080; "&gt;66&lt;/span&gt; &lt;span style="color: #000000; "&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;

&lt;p&gt;Infine è importante citare la classe &lt;strong&gt;BufferedStream&lt;/strong&gt; che permette di migliorare le performance implementando un meccanismo di lettura e scrittura bufferizzato.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/angellaa/aggbug/94685.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Angella</dc:creator>
            <guid>http://blogs.ugidotnet.org/angellaa/archive/2008/11/18/70-536-file-system-classes-and-streams.aspx</guid>
            <pubDate>Tue, 18 Nov 2008 14:51:37 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/angellaa/archive/2008/11/18/70-536-file-system-classes-and-streams.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/angellaa/comments/commentRss/94685.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/angellaa/services/trackbacks/94685.aspx</trackback:ping>
        </item>
        <item>
            <title>[70-536] - Serialization and Deserialization</title>
            <link>http://blogs.ugidotnet.org/angellaa/archive/2008/11/02/70-536-serialization-and-deserialization.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;Area di riferimento&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;- Implementing serialization and input/output functionality in a .NET Framework application (18 percent)    &lt;br /&gt;    - Serialize or deserialize an object or an object graph by using runtime serialization techniques.     &lt;br /&gt;        - May include but is not limited to: Serialization interfaces; Serialization attributes; SerializationEntry structure and SerializationInfo class;     &lt;br /&gt;        - ObjectManager class; Formatter class, FormatterConverter class, and FormatterServices class; StreamingContext structure     &lt;br /&gt;   - Control the serialization of an object into XML format by using the System.Xml.Serialization namespace.     &lt;br /&gt;       - May include but is not limited to: Serialize and deserialize objects into XML format by using the XmlSerializer class; Control serialization by using serialization attributes;     &lt;br /&gt;       - Implement XML serialization interfaces to provide custom formatting for XML serialization; Delegates and event handlers provided by the System.Xml.Serialization namespace  &lt;br /&gt;   - Implement custom serialization formatting by using the Serialization Formatter classes.  &lt;br /&gt;       - May include but is not limited to: SoapFormatter; BinaryFormatter class &lt;/p&gt;  &lt;p /&gt;  &lt;hr /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p /&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Serialization and Deserialization&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;La serializzazione consiste nel trasformare un oggetto in una sequenza di byte che può essere memorizzata o trasferita tra diverse applicazioni.&lt;/p&gt;  &lt;p&gt;Affinchè un tipo possa essere serializzato è necessario decorarlo con l'attributo &lt;strong&gt;[Serializable]&lt;/strong&gt;. Se non non si vuole serializzare un particolare membro allora si utilizza l'attributo &lt;strong&gt;[NonSerialized]&lt;/strong&gt;. Nel caso fosse necessario eseguire del codice dopo l'operazione di deserializzazione (per esempio per impostare membri calcolati che non sono stati serializzati) si può implementare l'interfaccia &lt;strong&gt;IDeserializationCallback &lt;/strong&gt;come mostrato nell'esempio.&lt;/p&gt;  &lt;div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:aeeb2c0c-5731-4312-ad92-a0ad521888e1" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;   &lt;pre style="font-size: 12px; overflow: auto; font-family: consolas; background-color: whitesmoke"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #008080"&gt; 1&lt;/span&gt; &lt;span style="color: #000000"&gt;        [Serializable]
&lt;/span&gt;&lt;span style="color: #008080"&gt; 2&lt;/span&gt; &lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&lt;span style="color: #000000"&gt; Student : IDeserializationCallback
&lt;/span&gt;&lt;span style="color: #008080"&gt; 3&lt;/span&gt; &lt;span style="color: #000000"&gt;        {
&lt;/span&gt;&lt;span style="color: #008080"&gt; 4&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; Student(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt; name, &lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt; surname, DateTime birthDate)
&lt;/span&gt;&lt;span style="color: #008080"&gt; 5&lt;/span&gt; &lt;span style="color: #000000"&gt;            {
&lt;/span&gt;&lt;span style="color: #008080"&gt; 6&lt;/span&gt; &lt;span style="color: #000000"&gt;                Name &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; name;
&lt;/span&gt;&lt;span style="color: #008080"&gt; 7&lt;/span&gt; &lt;span style="color: #000000"&gt;                Surname &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; surname;
&lt;/span&gt;&lt;span style="color: #008080"&gt; 8&lt;/span&gt; &lt;span style="color: #000000"&gt;                BirthDate &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; birthDate;
&lt;/span&gt;&lt;span style="color: #008080"&gt; 9&lt;/span&gt; &lt;span style="color: #000000"&gt;                calculateAge();
&lt;/span&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt; &lt;span style="color: #000000"&gt;            }
&lt;/span&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt; &lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt; Name { &lt;/span&gt;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;span style="color: #000000"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;span style="color: #000000"&gt;; }
&lt;/span&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt; Surname { &lt;/span&gt;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;span style="color: #000000"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;span style="color: #000000"&gt;; }
&lt;/span&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; DateTime BirthDate { &lt;/span&gt;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;span style="color: #000000"&gt;; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;span style="color: #000000"&gt;; }
&lt;/span&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt; &lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008080"&gt;16&lt;/span&gt; &lt;span style="color: #000000"&gt;            [NonSerialized]
&lt;/span&gt;&lt;span style="color: #008080"&gt;17&lt;/span&gt; &lt;span style="color: #000000"&gt;            [SoapIgnore]
&lt;/span&gt;&lt;span style="color: #008080"&gt;18&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt; age;
&lt;/span&gt;&lt;span style="color: #008080"&gt;19&lt;/span&gt; &lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008080"&gt;20&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&lt;span style="color: #000000"&gt; Age
&lt;/span&gt;&lt;span style="color: #008080"&gt;21&lt;/span&gt; &lt;span style="color: #000000"&gt;            {
&lt;/span&gt;&lt;span style="color: #008080"&gt;22&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;get&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008080"&gt;23&lt;/span&gt; &lt;span style="color: #000000"&gt;                {
&lt;/span&gt;&lt;span style="color: #008080"&gt;24&lt;/span&gt; &lt;span style="color: #000000"&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; age;
&lt;/span&gt;&lt;span style="color: #008080"&gt;25&lt;/span&gt; &lt;span style="color: #000000"&gt;                }
&lt;/span&gt;&lt;span style="color: #008080"&gt;26&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;set&lt;/span&gt;&lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008080"&gt;27&lt;/span&gt; &lt;span style="color: #000000"&gt;                {
&lt;/span&gt;&lt;span style="color: #008080"&gt;28&lt;/span&gt; &lt;span style="color: #000000"&gt;                    age &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; value;
&lt;/span&gt;&lt;span style="color: #008080"&gt;29&lt;/span&gt; &lt;span style="color: #000000"&gt;                }
&lt;/span&gt;&lt;span style="color: #008080"&gt;30&lt;/span&gt; &lt;span style="color: #000000"&gt;            }
&lt;/span&gt;&lt;span style="color: #008080"&gt;31&lt;/span&gt; &lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008080"&gt;32&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;override&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt;&lt;span style="color: #000000"&gt; ToString()
&lt;/span&gt;&lt;span style="color: #008080"&gt;33&lt;/span&gt; &lt;span style="color: #000000"&gt;            {
&lt;/span&gt;&lt;span style="color: #008080"&gt;34&lt;/span&gt; &lt;span style="color: #000000"&gt;                &lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt; Name &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; Surname &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; BirthDate.ToShortDateString() &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;, &lt;/span&gt;&lt;span style="color: #000000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #000000"&gt;+&lt;/span&gt;&lt;span style="color: #000000"&gt; age;
&lt;/span&gt;&lt;span style="color: #008080"&gt;35&lt;/span&gt; &lt;span style="color: #000000"&gt;            }
&lt;/span&gt;&lt;span style="color: #008080"&gt;36&lt;/span&gt; &lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008080"&gt;37&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; calculateAge()
&lt;/span&gt;&lt;span style="color: #008080"&gt;38&lt;/span&gt; &lt;span style="color: #000000"&gt;            {
&lt;/span&gt;&lt;span style="color: #008080"&gt;39&lt;/span&gt; &lt;span style="color: #000000"&gt;                Age &lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt; DateTime.Now.Year &lt;/span&gt;&lt;span style="color: #000000"&gt;-&lt;/span&gt;&lt;span style="color: #000000"&gt; BirthDate.Year;
&lt;/span&gt;&lt;span style="color: #008080"&gt;40&lt;/span&gt; &lt;span style="color: #000000"&gt;            }
&lt;/span&gt;&lt;span style="color: #008080"&gt;41&lt;/span&gt; &lt;span style="color: #000000"&gt;
&lt;/span&gt;&lt;span style="color: #008080"&gt;42&lt;/span&gt; &lt;span style="color: #000000"&gt;            &lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt; &lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt; OnDeserialization(&lt;/span&gt;&lt;span style="color: #0000ff"&gt;object&lt;/span&gt;&lt;span style="color: #000000"&gt; sender)
&lt;/span&gt;&lt;span style="color: #008080"&gt;43&lt;/span&gt; &lt;span style="color: #000000"&gt;            {
&lt;/span&gt;&lt;span style="color: #008080"&gt;44&lt;/span&gt; &lt;span style="color: #000000"&gt;                calculateAge();
&lt;/span&gt;&lt;span style="color: #008080"&gt;45&lt;/span&gt; &lt;span style="color: #000000"&gt;            }
&lt;/span&gt;&lt;span style="color: #008080"&gt;46&lt;/span&gt; &lt;span style="color: #000000"&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;
&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;

&lt;p&gt;
  &lt;br /&gt;Con la classe &lt;strong&gt;BinaryFormatter&lt;/strong&gt; è possibile serializzare in modo efficiente l'oggetto ma questo sarà accessibile solo da parte di altre applicazioni .NET:&lt;/p&gt;

&lt;p /&gt;

&lt;p /&gt;

&lt;p&gt;
  &lt;/p&gt;&lt;div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:8edb7515-568d-49bb-8ea1-4348dd6a7499" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:WhiteSmoke;;overflow: none;;font-family:Consolas;font-size:12"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;static&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; Main(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt;[] args)
        {
            Student student &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; Student(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Andrea&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Angella&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; DateTime(&lt;/span&gt;&lt;span style="color: #000000; "&gt;1984&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #000000; "&gt;7&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #000000; "&gt;14&lt;/span&gt;&lt;span style="color: #000000; "&gt;));

            &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Binary Serialization&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;using&lt;/span&gt;&lt;span style="color: #000000; "&gt; (FileStream fs &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; FileStream(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;file.dat&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, FileMode.Create))
            {
                BinaryFormatter bf &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; BinaryFormatter();
                bf.Serialize(fs, student);
            }

            &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Binary Deserialization&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;using&lt;/span&gt;&lt;span style="color: #000000; "&gt; (FileStream fs &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; FileStream(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;file.dat&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, FileMode.Open))
            {
                BinaryFormatter bf &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;new&lt;/span&gt;&lt;span style="color: #000000; "&gt; BinaryFormatter();
                student &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; (Student)bf.Deserialize(fs);
            }

            Console.Write(student);
            Console.ReadKey();
        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;


&lt;p&gt; &lt;/p&gt;

&lt;p&gt;La classe &lt;strong&gt;SoapFormatter&lt;/strong&gt; (assembly &lt;strong&gt;System.Runtime.Serialization.Formatters.Soap&lt;/strong&gt;) permette di serializzare un oggetto come un SOAP Envelop adatto per essere condiviso anche con applicazioni non appartenenti al mondo .NET. Il suo utilizzo è analogo a quello della classe BinaryFormatter. E' possibile controllare la formattazione utilizzando opportuni attributi come &lt;strong&gt;[SoapAttribute]&lt;/strong&gt;, &lt;strong&gt;[SoapElement]&lt;/strong&gt;, &lt;strong&gt;[SoapEnum]&lt;/strong&gt;, &lt;strong&gt;[SoapIgnore]&lt;/strong&gt; e &lt;strong&gt;[SoapInclude]&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;E' possibile serializzare un oggetto in uno specifico formato XML attraverso la classe &lt;strong&gt;XmlSerializer&lt;/strong&gt;. Questa modalità ovviamente porta con se i vantaggi del linguaggio XML e cioè forte interoperabilità, amministrazione user-friendly e migliore compatibilità all'indietro. La serializzazione XML può serializzare solamente membri pubblici (al contrario di quella binaria) e non possono essere serializzati grafi di oggetti. E' richiesto un costruttore di default. Anche in questo caso è possibile personalizzare il markup xml che sarà generato utilizzando opportuni attributi come&lt;strong&gt; [XmlAttribute]&lt;/strong&gt;, &lt;strong&gt;[XmlElement]&lt;/strong&gt;, &lt;strong&gt;[XmlIgnore]&lt;/strong&gt;, &lt;strong&gt;[XmlEnum]&lt;/strong&gt; ecc.&lt;/p&gt;

&lt;p&gt;E' interessante la possibiiltà di generare classi con attributi xml a partire da un file XML Schema Definition. Lo strumento da utilizzare è il tool a linea di comando &lt;strong&gt;xsd&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Se si vuole avere un controllo maggiore sul processo di serializzazione e deserializzazione è possibile implementare l'interfaccia &lt;strong&gt;ISerializable&lt;/strong&gt;. Tramite il metodo &lt;strong&gt;GetObjectData&lt;/strong&gt; si specificano i membri che si vogliono serializzare. All'interno di un particolare costruttore (chiamato dopo la fase di deserializzazione) sarà possibile accedere a questi valori e ripristinare il contenuto dell'oggetto. E' possibile intervenire prima e dopo la fase di serializzazione e deserializzazione inserendo opportuni metodi decorati con gli attributi &lt;strong&gt;[OnSerializing]&lt;/strong&gt;, &lt;strong&gt;[OnSerialized]&lt;/strong&gt;, &lt;strong&gt;[OnDeserializing]&lt;/strong&gt;, &lt;strong&gt;[OnDeserialized]&lt;/strong&gt;. La classe &lt;strong&gt;StreamingContext&lt;/strong&gt; è utile se si vuole serializzare un oggetto in modo differente in base alla destinazione (stesso processo, processi su macchine differenti, ecc. ). 

  &lt;br /&gt;&lt;/p&gt;

&lt;div class="wlWriterSmartContent" id="scid:57F11A72-B0E5-49c7-9094-E3A15BD5B5E7:782417b4-9f82-49c6-8f8a-86ce6db91f3b" style="padding-right: 0px; display: inline; padding-left: 0px; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;&lt;pre style="background-color:WhiteSmoke;;overflow: none;;font-family:Consolas;font-size:12"&gt;&lt;div&gt;&lt;!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt;&lt;span style="color: #000000; "&gt;    [Serializable]
    &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;class&lt;/span&gt;&lt;span style="color: #000000; "&gt; Student : ISerializable
    {
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; Name { &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;get&lt;/span&gt;&lt;span style="color: #000000; "&gt;; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;set&lt;/span&gt;&lt;span style="color: #000000; "&gt;; }
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; Surname { &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;get&lt;/span&gt;&lt;span style="color: #000000; "&gt;; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;set&lt;/span&gt;&lt;span style="color: #000000; "&gt;; }
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; DateTime BirthDate { &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;get&lt;/span&gt;&lt;span style="color: #000000; "&gt;; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;set&lt;/span&gt;&lt;span style="color: #000000; "&gt;; }
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;int&lt;/span&gt;&lt;span style="color: #000000; "&gt; Age { &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;get&lt;/span&gt;&lt;span style="color: #000000; "&gt;; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;set&lt;/span&gt;&lt;span style="color: #000000; "&gt;; }

        &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Costruttore standard&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; Student(&lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; name, &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; surname, DateTime birthDate)
        {
            Name &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; name;
            Surname &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; surname;
            BirthDate &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; birthDate;
            calculateAge();
        }

        &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Costruttore per la deserializzazione&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; Student(SerializationInfo info, StreamingContext context)
        {
            Name &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; info.GetString(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Name&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
            Surname &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; info.GetString(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Surname&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
            BirthDate &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; info.GetDateTime(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;BirthDate&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;);
        }
        
        [OnSerializing]
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; BeforeSerialization(StreamingContext context)
        {
            &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; ...&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;        }

        [OnSerialized]
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; AfterSerialization(StreamingContext context)
        {
            &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; ...&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;        }

        [OnDeserializing]
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; BeforeDeserialization(StreamingContext context)
        {
            &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; ...&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;        }
        
        [OnDeserialized]
        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; AfterDeserialization(StreamingContext context)
        {
            calculateAge();
        }

        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;override&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;string&lt;/span&gt;&lt;span style="color: #000000; "&gt; ToString()
        {
            &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;return&lt;/span&gt;&lt;span style="color: #000000; "&gt; Name &lt;/span&gt;&lt;span style="color: #000000; "&gt;+&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;+&lt;/span&gt;&lt;span style="color: #000000; "&gt; Surname &lt;/span&gt;&lt;span style="color: #000000; "&gt;+&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;+&lt;/span&gt;&lt;span style="color: #000000; "&gt; BirthDate.ToShortDateString() &lt;/span&gt;&lt;span style="color: #000000; "&gt;+&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, &lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #000000; "&gt;+&lt;/span&gt;&lt;span style="color: #000000; "&gt; Age;
        }

        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;private&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; calculateAge()
        {
            Age &lt;/span&gt;&lt;span style="color: #000000; "&gt;=&lt;/span&gt;&lt;span style="color: #000000; "&gt; DateTime.Now.Year &lt;/span&gt;&lt;span style="color: #000000; "&gt;-&lt;/span&gt;&lt;span style="color: #000000; "&gt; BirthDate.Year;
        }

        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;#region&lt;/span&gt;&lt;span style="color: #000000; "&gt; ISerializable Members&lt;/span&gt;&lt;span style="color: #000000; "&gt;

        &lt;/span&gt;&lt;span style="color: #008000; "&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt; Metodo chiamato durante la fase di serializzazione&lt;/span&gt;&lt;span style="color: #008000; "&gt;
&lt;/span&gt;&lt;span style="color: #000000; "&gt;        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;public&lt;/span&gt;&lt;span style="color: #000000; "&gt; &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;void&lt;/span&gt;&lt;span style="color: #000000; "&gt; GetObjectData(SerializationInfo info, StreamingContext context)
        {
            info.AddValue(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Name&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, Name);
            info.AddValue(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;Surname&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, Surname);
            info.AddValue(&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;BirthDate&lt;/span&gt;&lt;span style="color: #000000; "&gt;"&lt;/span&gt;&lt;span style="color: #000000; "&gt;, BirthDate);
        }

        &lt;/span&gt;&lt;span style="color: #0000FF; "&gt;#endregion&lt;/span&gt;&lt;span style="color: #000000; "&gt;
    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&lt;!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin.  http://dunnhq.com --&gt;&lt;/div&gt;

&lt;p&gt;
  &lt;br /&gt;Anche se è raramente necessario è bene sapere che è offerta anche la possibilità di realizzare dei formatter personalizzati. Invece di utilizzare ad esempio la classe BinaryFormatter è possibile costruire il proprio formatter implementando l'interfaccia &lt;strong&gt;IFormatter&lt;/strong&gt; o &lt;strong&gt;IGenericFormatter&lt;/strong&gt;.  &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/angellaa/aggbug/94491.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Angella</dc:creator>
            <guid>http://blogs.ugidotnet.org/angellaa/archive/2008/11/02/70-536-serialization-and-deserialization.aspx</guid>
            <pubDate>Sun, 02 Nov 2008 00:59:23 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/angellaa/archive/2008/11/02/70-536-serialization-and-deserialization.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/angellaa/comments/commentRss/94491.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/angellaa/services/trackbacks/94491.aspx</trackback:ping>
        </item>
        <item>
            <title>[70-536] - .NET Mail API</title>
            <link>http://blogs.ugidotnet.org/angellaa/archive/2008/05/10/70-536---.net-mail-api.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;Area di riferimento&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;- Implementing interoperability, reflection, and mailing functionality in a .NET Framework application   &lt;br /&gt;    - Send electronic mail to a Simple Mail Transfer Protocol (SMTP) server for delivery from a .NET Framework application.  &lt;br /&gt;        - May include but is not limited to:  &lt;br /&gt;            - MailMessage class; MailAddress class and MailAddressCollection class;     &lt;br /&gt;            - SmtpClient class, SmtpPermission class, and SmtpPermissionAttribute class;     &lt;br /&gt;            - Attachment class, AttachmentBase class, and AttachmentCollection class;     &lt;br /&gt;            - SmtpException class, SmtpFailedReceipientException class, and SmtpFailedReceipientsException class;    &lt;br /&gt;            - SendCompletedEventHandler delegate; LinkedResource class and LinkedResourceCollection class;  &lt;br /&gt;            - AlternateView class and AlternateViewCollection class&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;&lt;strong&gt;.NET Mail API&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;L'utilizzo delle API per l'invio di messaggi di posta elettronica è molto semplice.   &lt;br /&gt;Potete scaricare una semplice soluzione di esempio al seguente indirizzo: &lt;a title="http://www.angellaa.it/lab/dettagli-soluzione.aspx?id=14" href="http://www.angellaa.it/lab/dettagli-soluzione.aspx?id=14"&gt;http://www.angellaa.it/lab/dettagli-soluzione.aspx?id=14&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I passi da seguire sono i seguenti:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Costruire un' istanza della classe &lt;strong&gt;MailMessage&lt;/strong&gt; che rappresenta un messaggio specificando &lt;u&gt;indirizzo sorgente&lt;/u&gt;, &lt;u&gt;indirizzi destinatari&lt;/u&gt;, &lt;u&gt;oggetto&lt;/u&gt;, &lt;u&gt;corpo&lt;/u&gt;, &lt;u&gt;priorità&lt;/u&gt; ed eventuali file &lt;u&gt;allegati&lt;/u&gt;.&lt;/li&gt;    &lt;li&gt;Costruire un'istanza della classe &lt;strong&gt;SmtpClient&lt;/strong&gt; specificando, se necessario, le credenziali di accesso al server di posta&lt;/li&gt;    &lt;li&gt;Chiamare il metodo &lt;strong&gt;Send&lt;/strong&gt; o &lt;strong&gt;SendAsync&lt;/strong&gt; della classe SmtpClient rispettivamente per inviare il messaggio in modo sincrono o in modo asincrono&lt;/li&gt;    &lt;li&gt;Gestire opportunamente gli errori gestendo le eccezioni &lt;strong&gt;SmtpException&lt;/strong&gt;, &lt;strong&gt;SmtpFailedReceipientException&lt;/strong&gt; e &lt;strong&gt;SmtpFailedReceipientsException&lt;/strong&gt;.&lt;/li&gt; &lt;/ul&gt;&lt;img src="http://blogs.ugidotnet.org/angellaa/aggbug/92604.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Angella</dc:creator>
            <guid>http://blogs.ugidotnet.org/angellaa/archive/2008/05/10/70-536---.net-mail-api.aspx</guid>
            <pubDate>Sat, 10 May 2008 17:32:53 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/angellaa/archive/2008/05/10/70-536---.net-mail-api.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/angellaa/comments/commentRss/92604.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/angellaa/services/trackbacks/92604.aspx</trackback:ping>
        </item>
        <item>
            <title>[70-536] - Application Domain and Reflection</title>
            <link>http://blogs.ugidotnet.org/angellaa/archive/2008/04/09/92136.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;     &lt;br /&gt;Area di riferimento&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;- Implementing service processes, threading, and application domains in a .NET Framework application    &lt;br /&gt;   - Create a unit of isolation for common language runtime in a .NET Framework application by using application domains     &lt;br /&gt;      - Create an application domain     &lt;br /&gt;      - Unload an application domain     &lt;br /&gt;      - Configure an application domain     &lt;br /&gt;      - Retrieve setup information from an application domain     &lt;br /&gt;      - Load assemblies into an application domain     &lt;br /&gt;- Implementing interoperability, reflection, and mailing functionality in a .NET Framework application     &lt;br /&gt;    - Implement reflection functionality in a .NET Framework application, and create metadata, Microsoft Intermediate language (MSIL), and a PE file by using System.Reflection.Emit namespace     &lt;br /&gt;      - Assembly class  &lt;br /&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;     &lt;br /&gt;&lt;font size="3"&gt;Application Domain&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Gli Application Domain, brevemente &lt;strong&gt;AppDomains&lt;/strong&gt;,permettono al codice di terze parti (e quindi non sicuro) di eseguire all'interno di un processo esistente con la garanzia che le strutture dati, il codice e il contesto di sicurezza non sarà compromesso. Permettono quindi di realizzare una importate caratteristica: &lt;strong&gt;l'isolamento&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Quando il CLR viene inizializzato, automaticamente viene creato un AppDomain chiamato &lt;strong&gt;Default AppDomain&lt;/strong&gt; che sarà distrutto solamente quando il processo di Windows che lo ospita termininerà.&lt;/p&gt;  &lt;p&gt;Le caratteristiche offerte da un AppDomain sono:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Il codice di un AppDomain non può essere acceduto da un altro AppDomain se non utilizzando la semantica &lt;strong&gt;marshal-by-reference&lt;/strong&gt; o &lt;strong&gt;marshal-by-value&lt;/strong&gt; scatenando controlli di &lt;strong&gt;Code Access Security&lt;/strong&gt; (&lt;strong&gt;CAS&lt;/strong&gt;) &lt;/li&gt;    &lt;li&gt;Gli AppDomains possono essere scaricati (&lt;strong&gt;unload&lt;/strong&gt;) &lt;/li&gt;    &lt;li&gt;Tramite la CAS è possibile definire in modo estremamente dettagliato il contesto di sicurezza in cui esegue uno specifico AppDomain &lt;/li&gt;    &lt;li&gt;Ciascun AppDomain può essere configurato in modo autonomo &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;E' possibile ottenere un riferimento all' AppDomain in cui sta eseguendo il thread chiamante in questo modo:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;AppDomain app = Thread.GetDomain();&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;   &lt;br /&gt;E' possibile creare un AppDomain utilizzando il metodo &lt;strong&gt;CreateDomain&lt;/strong&gt; della classe AppDomain che accetta come primo argomento il nome e come altri argomenti un oggetto &lt;strong&gt;Evidence&lt;/strong&gt; e un oggetto &lt;strong&gt;AppDomainSetup&lt;/strong&gt;. L'oggetto Evidence permette di specificare le opzioni relative al contesto di sicurezza (scriverò in seguito post specifici sulla CAS) mentre l'oggetto AppDomainSetup permette di configurare l'AppDomain.     &lt;br /&gt;Tramite il metodo &lt;strong&gt;Unload&lt;/strong&gt; della classe AppDomain è invece possibile scaricare un AppDomain quando non è più necessario.&lt;/p&gt;  &lt;p&gt;La semantica marshal-by-reference consiste nell'ottenere un oggetto di tipo &lt;strong&gt;MarshalByRefObject&lt;/strong&gt; che rappresenta un Proxy verso un oggetto presente in un altro AppDomain. In questo modo è possibile invocare tutti i metodi di quell'oggetto come se potessimo accedervi direttamente, in realtà sotto sotto il CLR fa transire il thread chiamante dall'AppDomain corrente al nuovo AppDomain garantendo quindi isolamento e sicurezza. I metodi per ottenere un proxy sono &lt;strong&gt;CreateInstanceAndUnwrap&lt;/strong&gt;, &lt;strong&gt;CreateInstanceFromAndUnwrap&lt;/strong&gt; e simili.&lt;/p&gt;  &lt;p&gt;La semantica marshal-by-value consiste invece nell'ottenere un oggetto che è una perfetta copia dell'oggetto presente nell'altro AppDomain e totalmente indipendente. E' fondamentale in questo caso che l'oggetto che si vuole far transitare sia decorato con l'attributo &lt;strong&gt;[Serializable]&lt;/strong&gt;. I metodi per ottenere un comportamento di questo tipo sono gli stessi della semantica marshal-by-reference, ciò che cambia infatti è il modo in cui sono definiti i tipi nell'AppDomain e come vegono trattati i risultati.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Un esempio pratico&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Mi rendo conto che questo argomento non è dei più semplici. Per questo motivo ho deciso di creare una semplice ma significativa applicazione che sfrutta i vantaggi offerti dagli AppDomain.    &lt;br /&gt;Questa applicazione permette semplicemente di effettuare delle operazioni a partire da due numeri interi. La cosa particolare è che l'applicazione stessa può essere estesa tramite altre operazioni presenti in apposite dll (comunemente chiamate AddIn o PlugIn). Vediamo quindi come realizzare una semplice applicazione estensibile con AddIn.&lt;/p&gt;  &lt;p&gt;Il problema principale di questo tipo di applicazioni è che non è possibile fidarsi del codice prodotto da terze parti, quindi è necessario, anzi direi obbligatorio, sfruttare l'isolamento offerto dagli AppDomain per garantire robustezza e sicurezza all'applicazione. L'applicazioni può essere scaricata al seguente indirizzo: &lt;font face="Arial"&gt;&lt;a href="http://www.angellaa.it/lab/dettagli-soluzione.aspx?id=12"&gt;http://www.angellaa.it/lab/dettagli-soluzione.aspx?id=12&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Generalmente si procede nel seguente modo:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Si crea un assembly "Contratto" che definisce una interfaccia / classe-base i cui metodi sono usati dal meccanismo di comunicazione tra l'applicazione host e gli add-in. Si dovrebbe anche dare all'assembly uno strong name ma nell'esempio per semplicità non l'ho fatto &lt;/li&gt;    &lt;li&gt;Gli sviluppatori degli add-in fanno riferimento all'assembly "Contratto" per costruire i loro assembly &lt;/li&gt;    &lt;li&gt;Si costruisce l'applicazione "Host" che ovviamente anch'essa farà riferimento al "Contratto" e in più sarà presente una cartella in cui incollare i vari add-in. Al caricamento o al verificarsi di particolari eventi, l'applicazione cercherà in questa cartella gli add-in che definiscono le funzionalità aggiuntive &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Partiamo dal contratto rappresentato dall'assembly &lt;strong&gt;DemoAddInApplicationApi&lt;/strong&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;namespace DemoAddInApplicationApi          &lt;br /&gt;{           &lt;br /&gt;    public interface DemoAddInApplicationInterface           &lt;br /&gt;    {           &lt;br /&gt;        int elabora(int a, int b);           &lt;br /&gt;    } &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;    public abstract class DemoAddInApplicationBase : &lt;font color="#ff0000"&gt;MarshalByRefObject&lt;/font&gt;, DemoAddInApplicationInterface           &lt;br /&gt;    {           &lt;br /&gt;        &lt;font color="#ff0000"&gt;public abstract int elabora(int a, int b);&lt;/font&gt;           &lt;br /&gt;    } &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;   &lt;br /&gt;La classe astratta &lt;strong&gt;DemoAddInApplicationBase&lt;/strong&gt; sarà quella da cui dovranno ereditare le classi specifiche create dagli sviluppatori degli Add-In. Ho introdotto questa classe per il semplice motivo che affinchè sia possibile sfruttare la semantica mashal-by-reference è necessario che l'oggetto scambiato sia un MarshalByRefObject. In questo modo evito che gli sviluppatori degli add-in si preoccupino di questi dettagli, lasciamo a loro il solo compito di definire un'implementazione specifica dell'operazione.&lt;/p&gt;  &lt;p&gt;Ecco una parte del codice che ha scritto lo sviluppatore dell'add-in &lt;strong&gt;DemoAddInApplication1&lt;/strong&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;namespace DemoAddInApplication1          &lt;br /&gt;{           &lt;br /&gt;    public class DemoAddInApplicationDifferenza : &lt;font color="#ff0000"&gt;DemoAddInApplicationBase&lt;/font&gt;           &lt;br /&gt;    {           &lt;br /&gt;        public override int elabora(int a, int b)           &lt;br /&gt;        {           &lt;br /&gt;            &lt;font color="#ff0000"&gt;return a - b;&lt;/font&gt;           &lt;br /&gt;        }           &lt;br /&gt;    }&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;    public class DemoAddInApplicationProdotto : &lt;font color="#ff0000"&gt;DemoAddInApplicationBase&lt;/font&gt;           &lt;br /&gt;    {           &lt;br /&gt;        public override int elabora(int a, int b)           &lt;br /&gt;        {           &lt;br /&gt;            &lt;font color="#ff0000"&gt;return a * b;            &lt;br /&gt;&lt;/font&gt;        }  &lt;br /&gt;    }&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;    ...          &lt;br /&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;   &lt;br /&gt;Andiamo quindi a vedere come è stata realizzata l'applicazione host.     &lt;br /&gt;Il seguente codice carica in una combo box l'elenco degli add-in presenti nella cartella add-in:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Funzione che scandisce la cartella Add-in per rilevare la presenza di eventuali            &lt;br /&gt;// nuovi Add-In. Visualizza quindi i loro nomi nella Combo-Box per la scelta.             &lt;br /&gt;&lt;/font&gt;private void ricaricaAddIn()           &lt;br /&gt;{     &lt;br /&gt;    string[] files = &lt;font color="#ff0000"&gt;Directory.GetFiles("Add-in", "*.dll")&lt;/font&gt;; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;    cbAddIn.Items.Clear();          &lt;br /&gt;    cbOperazioni.Items.Clear();           &lt;br /&gt;    btnCalcola.Enabled = false; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;    foreach (string file in files)          &lt;br /&gt;    {           &lt;br /&gt;        &lt;font color="#ff0000"&gt;cbAddIn.Items.Add( file );            &lt;br /&gt;&lt;/font&gt;    }           &lt;br /&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;   &lt;br /&gt;Nel momento in cui viene selezionato l'add-in che si desidera utilizzare, inizia la ricerca delle possibili operazioni offerte all'interno di quello specifico add-in:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;private void cbAddIn_SelectedIndexChanged(object sender, EventArgs e)          &lt;br /&gt;{    &lt;br /&gt;    object item = cbAddIn.Items[cbAddIn.SelectedIndex];           &lt;br /&gt;    &lt;font color="#ff0000"&gt;Assembly a = Assembly.LoadFrom( item.ToString() ); &lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;    cbOperazioni.Items.Clear();          &lt;br /&gt;    foreach (&lt;font color="#ff0000"&gt;Type t in a.GetExportedTypes()&lt;/font&gt;)           &lt;br /&gt;    {           &lt;br /&gt;        if (&lt;font color="#ff0000"&gt;t.IsClass&lt;/font&gt; &amp;amp;&amp;amp; &lt;font color="#ff0000"&gt;typeof(DemoAddInApplicationBase).IsAssignableFrom(t)&lt;/font&gt;)           &lt;br /&gt;        {           &lt;br /&gt;            cbOperazioni.Items.Add(t);           &lt;br /&gt;        }           &lt;br /&gt;    }           &lt;br /&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;   &lt;br /&gt;Il metodo &lt;strong&gt;LoadFrom&lt;/strong&gt; permette di caricare un assembly. Il metodo &lt;strong&gt;GetExportedTypes&lt;/strong&gt; restituisce tutti i tipi pubblici esposti da quell'assembly. Tramite la proprietà &lt;strong&gt;isClass&lt;/strong&gt; è possibile determinare se il tipo è una classe e tramite il metodo &lt;strong&gt;IsAssignableFrom&lt;/strong&gt; è possibile determinare se t è di tipo DemoAddInApplicationBase.&lt;/p&gt;  &lt;p&gt;Il gestore dell'evento click del pulsante Calcola è il cuore del nostro discorso. Viene infatti creato un AppDomain a partire dal nome del file che individua l'add-in, dopodichè viene costruito un oggetto proxy che fa riferimento all'oggetto specifico che implementa l'operazione. Quindi eseguiamo l'operazione all'interno dell'AppDomain creato, visualizziamo il risultato e scarichiamo l'AppDomain.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;private void btnCalcola_Click(object sender, EventArgs e)          &lt;br /&gt;{           &lt;br /&gt;    &lt;font color="#008000"&gt;// recupero il tipo dell'operazione selezionata            &lt;br /&gt;&lt;/font&gt;    &lt;font color="#ff0000"&gt;Type t = (Type)cbOperazioni.Items[cbOperazioni.SelectedIndex];            &lt;br /&gt;&lt;/font&gt;    string addInPath = cbAddIn.Items[cbAddIn.SelectedIndex].ToString();           &lt;br /&gt;          &lt;br /&gt;    &lt;font color="#008000"&gt;// Costruisco un AppDomain in cui eseguire il codice dell'Add-in&lt;/font&gt;           &lt;br /&gt;    &lt;font color="#ff0000"&gt;AppDomain appDomain = AppDomain.CreateDomain("Add-in", null, null); &lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;    &lt;font color="#ff0000"&gt;DemoAddInApplicationBase addIn =            &lt;br /&gt;        (DemoAddInApplicationBase)appDomain.CreateInstanceFromAndUnwrap(addInPath, t.FullName);&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;    &lt;font color="#008000"&gt;// Recupero gli operandi&lt;/font&gt;           &lt;br /&gt;    int a = Int32.Parse(txtA.Text);           &lt;br /&gt;    int b = Int32.Parse(txtB.Text); &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;    &lt;font color="#008000"&gt;// Eseguo il metodo (Nota addIn è un Proxy)&lt;/font&gt;           &lt;br /&gt;    int ris = &lt;font color="#ff0000"&gt;addIn.elabora(a, b);&lt;/font&gt; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;    &lt;font color="#008000"&gt;// Visualizzo i risultati&lt;/font&gt;           &lt;br /&gt;    txtRisultato.Text = ris.ToString(); &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;    &lt;font color="#ff0000"&gt;AppDomain.Unload(appDomain);&lt;/font&gt;           &lt;br /&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;   &lt;br /&gt;Ovviamente come avrete sicuramente notato, non ho gestito le possibili eccezioni che potrebbero verificarsi e nemmeno ho impostato l'oggetto Evidence per definire i permessi di esecuzione del codice degli add-in. Tornerò su questo ultimo punto nei post dedicati all'importante argomento della sicurezza applicativa.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/angellaa/aggbug/92136.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Angella</dc:creator>
            <guid>http://blogs.ugidotnet.org/angellaa/archive/2008/04/09/92136.aspx</guid>
            <pubDate>Wed, 09 Apr 2008 15:15:58 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/angellaa/archive/2008/04/09/92136.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/angellaa/comments/commentRss/92136.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/angellaa/services/trackbacks/92136.aspx</trackback:ping>
        </item>
        <item>
            <title>[70-536] - AutoResetEvent e ManualResetEvent</title>
            <link>http://blogs.ugidotnet.org/angellaa/archive/2008/03/30/91949.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;     &lt;br /&gt;Area di riferimento&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;- Implementing service processes, threading, and application domains in a .NET Framework application    &lt;br /&gt;   - Develop multithreaded .NET Framework applications     &lt;br /&gt;      - AutoResetEvent class and ManualResetEvent class    &lt;br /&gt;      - EventWaitHandle class, RegisterWaitHandle class, SendOrPostCallback delegate and IOCompletionCallback delegate&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;&lt;strong&gt;     &lt;br /&gt;EventWaitHandle&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;L'oggetto &lt;strong&gt;EventWaitHandle&lt;/strong&gt; ( e gli oggetti derivati &lt;strong&gt;AutoResetEvent&lt;/strong&gt; e &lt;strong&gt;ManualResetEvent&lt;/strong&gt; ) permette di gestire attraverso segnali la sincronizzazione tra diversi thread. &lt;/p&gt;  &lt;p&gt;I metodi principali sono:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Set()&lt;/strong&gt; che imposta lo stato dell'evento a segnalato, permettendo a uno o più dei thread in attesa di procedere&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Reset() &lt;/strong&gt;che imposta lo stato dell'evento a non segnalato, che causerà il blocco dei thread&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;WaitOne()&lt;/strong&gt; che blocca il thread corrente se l'evento non è segnalato altrimenti concede l'accesso.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;La differenza tra un AutoResetEvent e un ManualResetEvent è semplicemente che dopo la WaitOne() nel primo caso viene effettuato il Reset() in automatico mentre nel secondo caso bisognerà gestire manualmente il reset dell'evento.&lt;/p&gt;  &lt;p&gt;Per vedere in azione questa classe consideriamo un esempio. Supponiamo di avere un unico thread produttore e diversi thread consumatori. Il dato prodotto dal produttore è un numero intero. Si vuole fare in modo che una volta prodotto il dato il produttore si metta in attesa che venga consumato da qualche consumatore e che ciascun consumatore si metta in attesa che un dato venga prodotto ( non ho realizzato un meccanismo bufferizzato per semplicità ).&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;class Program         &lt;br /&gt;{          &lt;br /&gt;    private const int N_COMSUMATORI = 5;           &lt;font color="#008000"&gt;// numero totale dei consumatori&lt;/font&gt;          &lt;br /&gt;    private const int N_LETTURE = 3;               &lt;font color="#008000"&gt;// numero totale di letture per consumatore &lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;    &lt;font color="#ff0000"&gt;private static EventWaitHandle datoPronto;&lt;/font&gt;     &lt;font color="#008000"&gt;// segnalato quando il dato è pronto           &lt;br /&gt;&lt;/font&gt;    &lt;font color="#ff0000"&gt;private static EventWaitHandle datoLetto;&lt;/font&gt;      &lt;font color="#008000"&gt;// segnalato quando il dato è stato letto&lt;/font&gt; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;    private static int cont = 1;                    &lt;br /&gt;    private static int dato = 0;                   &lt;font color="#008000"&gt;// zona di memoria condivisa per la memorizzazione del dato&lt;/font&gt; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;    public static void Main(string[] args)         &lt;br /&gt;    {          &lt;br /&gt;        Thread[] threadConsumatori;     &lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;        Thread threadProduttore;        &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;        &lt;font color="#008000"&gt;// Costruisco gli oggetti EventWaitHandle impostati opportunamente           &lt;br /&gt;&lt;/font&gt;        &lt;font color="#ff0000"&gt;datoPronto = new EventWaitHandle(false, EventResetMode.AutoReset);           &lt;br /&gt;        datoLetto = new EventWaitHandle(true, EventResetMode.AutoReset); &lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;        threadConsumatori = new Thread[N_COMSUMATORI]; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;        &lt;font color="#008000"&gt;// Faccio partire i thread consumatori           &lt;br /&gt;&lt;/font&gt;        for (int i = 0; i &amp;lt; N_COMSUMATORI; i++)          &lt;br /&gt;        {          &lt;br /&gt;            threadConsumatori[i] = new Thread(new ParameterizedThreadStart(consumatore));          &lt;br /&gt;            threadConsumatori[i].Start(i);          &lt;br /&gt;        } &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;        &lt;font color="#008000"&gt;// Faccio partire il thread produttore&lt;/font&gt;          &lt;br /&gt;        threadProduttore = new Thread(produttore);          &lt;br /&gt;        threadProduttore.Start(); &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;        &lt;font color="#008000"&gt;// Attendo che tutti i consumatori abbiano finito           &lt;br /&gt;&lt;/font&gt;        for (int i = 0; i &amp;lt; N_COMSUMATORI; i++)          &lt;br /&gt;        {          &lt;br /&gt;            threadConsumatori[i].Join();          &lt;br /&gt;        } &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;        &lt;font color="#008000"&gt;// termino il processo produttore           &lt;br /&gt;&lt;/font&gt;        threadProduttore.Abort(); &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;        Console.Write("Fine");         &lt;br /&gt;        Console.ReadKey();          &lt;br /&gt;    } &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;    public static void consumatore(object info)         &lt;br /&gt;    {          &lt;br /&gt;        int id = (int)info; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;        for(int i=0; i&amp;lt;N_LETTURE; i++)         &lt;br /&gt;        {          &lt;br /&gt;            &lt;font color="#008000"&gt;// Attendo che un dato sia pronto           &lt;br /&gt;&lt;/font&gt;            &lt;font color="#ff0000"&gt;datoPronto.WaitOne();&lt;/font&gt; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;            &lt;font color="#008000"&gt;// Utilizzo il dato           &lt;br /&gt;&lt;/font&gt;            Console.WriteLine("Consumatore {0}: letto {1}", id, dato);          &lt;br /&gt;            Thread.Sleep(1000); &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;           &lt;font color="#008000"&gt; // Segnalo che il dato è stato letto&lt;/font&gt;          &lt;br /&gt;            &lt;font color="#ff0000"&gt;datoLetto.Set();           &lt;br /&gt;&lt;/font&gt;        } &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;        Console.WriteLine("Consumatore {0} ha terminato", id);         &lt;br /&gt;    } &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;     &lt;br /&gt;    public static void produttore(object info)          &lt;br /&gt;    {          &lt;br /&gt;        while ( true )          &lt;br /&gt;        {          &lt;br /&gt;            &lt;font color="#008000"&gt;// attende che l'ultimo dato scritto venga consumato           &lt;br /&gt;&lt;/font&gt;            &lt;font color="#ff0000"&gt;datoLetto.WaitOne();&lt;/font&gt; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;           &lt;font color="#008000"&gt; // produce un nuovo dato&lt;/font&gt;          &lt;br /&gt;            dato = cont++;          &lt;br /&gt;            Thread.Sleep(1000);          &lt;br /&gt;            Console.WriteLine("Produttore: ho prodotto {0}", dato); &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;            &lt;font color="#008000"&gt;// segnala che un nuovo dato è pronto per essere consumato           &lt;br /&gt;&lt;/font&gt;            &lt;font color="#ff0000"&gt;datoPronto.Set();           &lt;br /&gt;&lt;/font&gt;        } &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;        Console.WriteLine("Il produttore ha terminato");         &lt;br /&gt;    } &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;   &lt;br /&gt;Ecco come si presenta l'output di una possibile esecuzione di questo codice:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New" color="#800000" size="2"&gt;&lt;strong&gt;Produttore: ho prodotto 1         &lt;br /&gt;Consumatore 3: letto 1          &lt;br /&gt;Produttore: ho prodotto 2          &lt;br /&gt;Consumatore 3: letto 2          &lt;br /&gt;Produttore: ho prodotto 3          &lt;br /&gt;Consumatore 3: letto 3          &lt;br /&gt;Consumatore 3 ha terminato          &lt;br /&gt;Produttore: ho prodotto 4          &lt;br /&gt;Consumatore 0: letto 4          &lt;br /&gt;Produttore: ho prodotto 5          &lt;br /&gt;Consumatore 0: letto 5          &lt;br /&gt;Produttore: ho prodotto 6          &lt;br /&gt;Consumatore 0: letto 6          &lt;br /&gt;Consumatore 0 ha terminato          &lt;br /&gt;Produttore: ho prodotto 7          &lt;br /&gt;Consumatore 1: letto 7          &lt;br /&gt;Produttore: ho prodotto 8          &lt;br /&gt;Consumatore 1: letto 8          &lt;br /&gt;Produttore: ho prodotto 9          &lt;br /&gt;Consumatore 4: letto 9          &lt;br /&gt;Produttore: ho prodotto 10          &lt;br /&gt;Consumatore 4: letto 10          &lt;br /&gt;Produttore: ho prodotto 11          &lt;br /&gt;Consumatore 1: letto 11          &lt;br /&gt;Consumatore 1 ha terminato          &lt;br /&gt;Produttore: ho prodotto 12          &lt;br /&gt;Consumatore 2: letto 12          &lt;br /&gt;Produttore: ho prodotto 13          &lt;br /&gt;Consumatore 2: letto 13          &lt;br /&gt;Produttore: ho prodotto 14          &lt;br /&gt;Consumatore 2: letto 14          &lt;br /&gt;Consumatore 2 ha terminato          &lt;br /&gt;Produttore: ho prodotto 15          &lt;br /&gt;Consumatore 4: letto 15          &lt;br /&gt;Consumatore 4 ha terminato          &lt;br /&gt;Fine&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;   &lt;br /&gt;In particolare nell'esempio vengono utilizzati due oggetti EventWaitHandle uno &lt;strong&gt;datoPronto&lt;/strong&gt; viene utilizzato dal produttore per segnalare quando un nuovo dato è disponibile mentre l'altro &lt;strong&gt;datoLetto&lt;/strong&gt; viene utilizzo dal consumatore per segnalare al produttore che il dato appena prodotto è stato correttamente consumato.&lt;/p&gt;  &lt;p&gt;E' importante notare che l'oggetto EventWaitHandle costruito utilizzando il valore &lt;strong&gt;EventResetMode.AutoReset&lt;/strong&gt; corrisponde all'oggetto AutoResetEvent. L'oggetto EventWaitHandle costruito utilizzando il valore &lt;strong&gt;ManualResetMode.ManualReset&lt;/strong&gt; corrisponde invece all'oggetto ManualResetEvent.&lt;/p&gt;  &lt;p&gt;La classe &lt;strong&gt;RegisterWaitHandle&lt;/strong&gt; e in particolare il suo metodo &lt;strong&gt;RegisterWaitForSingleObject()&lt;/strong&gt; viene invece utilizzata per eseguire un metodo di callback quando uno specifico wait handle viene segnalato.    &lt;br /&gt;Per maggiori dettagli guardare l'esempio su msdn al seguente indirizzo &lt;a href="http://msdn2.microsoft.com/en-us/library/system.threading.registeredwaithandle.aspx" target="_blank"&gt;http://msdn2.microsoft.com/en-us/library/system.threading.registeredwaithandle.aspx&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/angellaa/aggbug/91949.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Angella</dc:creator>
            <guid>http://blogs.ugidotnet.org/angellaa/archive/2008/03/30/91949.aspx</guid>
            <pubDate>Sun, 30 Mar 2008 15:21:24 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/angellaa/archive/2008/03/30/91949.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/angellaa/comments/commentRss/91949.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/angellaa/services/trackbacks/91949.aspx</trackback:ping>
        </item>
        <item>
            <title>[70-536] - ReaderWriterLock</title>
            <link>http://blogs.ugidotnet.org/angellaa/archive/2008/03/30/91948.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;     &lt;br /&gt;Area di riferimento&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;- Implementing service processes, threading, and application domains in a .NET Framework application    &lt;br /&gt;   - Develop multithreaded .NET Framework applications     &lt;br /&gt;      - ReaderWriterLock class&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;&lt;strong&gt;     &lt;br /&gt;ReaderWriterLock&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;La classe &lt;strong&gt;ReaderWriterLock&lt;/strong&gt; permette di risolvere il classico problema dei lettori e scrittori su una risorsa.  In particolare questo oggetto è pensato per gestire al meglio le situazioni in cui esistono tanti lettori e pochi scrittori quindi è opportuno utilizzarlo soltanto se la risorsa che viene gestita debba essere modificata poco frequentemente.&lt;/p&gt;  &lt;p&gt;E' possibile trovare un esempio completo su msdn al seguente indirizzo: &lt;a href="http://msdn2.microsoft.com/en-us/library/system.threading.readerwriterlock.aspx" target="_blank"&gt;http://msdn2.microsoft.com/en-us/library/system.threading.readerwriterlock.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;In particolare supponendo di avere una istanza dell'oggetto ReaderWriterLock di nome &lt;strong&gt;rwl&lt;/strong&gt; ( con molta fantasia direi :D ) ecco come si dovrebbe procedere per tentare un accesso in lettura alla risorsa.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;try  &lt;br /&gt;{  &lt;br /&gt;   &lt;font color="#ff0000"&gt;rwl.AcquireReaderLock(timeOut);  &lt;br /&gt;&lt;/font&gt;   try  &lt;br /&gt;   {  &lt;br /&gt;       &lt;font color="#008000"&gt;// Qui è possibile effettuare una lettura della risorsa&lt;/font&gt;  &lt;br /&gt;   }         &lt;br /&gt;   finally  &lt;br /&gt;   {  &lt;br /&gt;       &lt;font color="#008000"&gt;// E' importante assicurarsi di rilasciare il lock in lettura&lt;/font&gt;  &lt;br /&gt;       &lt;font color="#ff0000"&gt;rwl.ReleaseReaderLock();&lt;/font&gt;  &lt;br /&gt;   }  &lt;br /&gt;}  &lt;br /&gt;catch (ApplicationException)  &lt;br /&gt;{  &lt;br /&gt;   &lt;font color="#008000"&gt;// La richiesta di accesso in lettura è andata in time-out  &lt;br /&gt;&lt;/font&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&lt;font size="2"&gt;     &lt;br /&gt;Un codice analogo si dovrebbe scrivere per effettuare un accesso in scrittura con la sola differenza di utilizzare i metodi &lt;strong&gt;AcquireWriterLock(timeOut)&lt;/strong&gt; e &lt;strong&gt;ReleaseWriterLock()&lt;/strong&gt;.&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;All'interno di un blocco in lettura è possibile effettuare una richiesta di upgrade in modo tale da poter effettuare ahce una operazione di scrittura. Il metodo &lt;strong&gt;UpgradeToWriterLock(timeOut)&lt;/strong&gt; viene utilizzato proprio per questo scopo e restituisce un oggetto &lt;strong&gt;LockCookie&lt;/strong&gt; che dopo aver effettuato le opportune operazioni di scrittura deve essere passato al metodo &lt;strong&gt;DowngradeFromWriterLock()&lt;/strong&gt; per tornare al solo permesso in lettura. &lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&lt;font size="2"&gt;Ecco uno spezzone di codice che mostra quello che ho appena detto:&lt;/font&gt;&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;try         &lt;br /&gt;{          &lt;br /&gt;    &lt;font color="#ff0000"&gt;LockCookie lc = rwl.UpgradeToWriterLock(timeOut);           &lt;br /&gt;&lt;/font&gt;    try          &lt;br /&gt;    {          &lt;br /&gt;        &lt;font color="#008000"&gt;// Qui è possibile sia leggere che scrivere           &lt;br /&gt;&lt;/font&gt;    }        &lt;br /&gt;    finally          &lt;br /&gt;    {          &lt;br /&gt;        &lt;font color="#008000"&gt;// E' importante ricordarsi di effettuare il downgrade&lt;/font&gt;          &lt;br /&gt;        &lt;font color="#ff0000"&gt;rwl.DowngradeFromWriterLock(ref lc);           &lt;br /&gt;&lt;/font&gt;    }          &lt;br /&gt;}          &lt;br /&gt;catch (ApplicationException)          &lt;br /&gt;{          &lt;br /&gt;   &lt;font color="#008000"&gt; // La richiesta di upgrade è andata in time-out           &lt;br /&gt;&lt;/font&gt;    Interlocked.Increment(ref writerTimeouts);          &lt;br /&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;   &lt;br /&gt;Altri metodi che possono essere utilizzati sono &lt;strong&gt;ReleaseLock()&lt;/strong&gt; e &lt;strong&gt;RestoreLock(ref lc)&lt;/strong&gt; per rilasciare temporaneamente il lock il lettura e poi riprenderlo. In questo caso è importante controllare se nel frattempo si è verificato almeno un accesso in scrittura utilizzando il metodo &lt;strong&gt;AnyWritersSince(lastWriter)&lt;/strong&gt; che accetta come parametro il numero di sequenza dell'ultimo scrittore che deve essere letto prima di rilasciare il lock mediante la proprietà &lt;strong&gt;WriterSeqNum&lt;/strong&gt;. Ciò è necessario per confermare la validità o meno dei dati locali letti in precedenza al rilascio.&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Salva il numero di sequenza dello scrittore corrente&lt;/font&gt;          &lt;br /&gt;lastWriter = &lt;font color="#ff0000"&gt;rwl.WriterSeqNum&lt;/font&gt;; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Rilascia il lock           &lt;br /&gt;&lt;/font&gt;&lt;font color="#ff0000"&gt;LockCookie lc = rwl.ReleaseLock();&lt;/font&gt; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Riottiene il lock&lt;/font&gt;          &lt;br /&gt;&lt;font color="#ff0000"&gt;rwl.RestoreLock(ref lc);&lt;/font&gt; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;if (&lt;font color="#ff0000"&gt;rwl.AnyWritersSince(lastWriter)&lt;/font&gt;)          &lt;br /&gt;{          &lt;br /&gt;    &lt;font color="#008000"&gt;// la risorsa è cambiata, i dati locali potrebbero essere non validi           &lt;br /&gt;&lt;/font&gt;}          &lt;br /&gt;else          &lt;br /&gt;{          &lt;br /&gt;   &lt;font color="#008000"&gt; // la risorsa non è stata cambiata, i dati locali sono corretti&lt;/font&gt;          &lt;br /&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.ugidotnet.org/angellaa/aggbug/91948.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Angella</dc:creator>
            <guid>http://blogs.ugidotnet.org/angellaa/archive/2008/03/30/91948.aspx</guid>
            <pubDate>Sun, 30 Mar 2008 11:37:26 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/angellaa/archive/2008/03/30/91948.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/angellaa/comments/commentRss/91948.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/angellaa/services/trackbacks/91948.aspx</trackback:ping>
        </item>
        <item>
            <title>[70-536] - Thread Synchronization: Interlocked and Monitor classes</title>
            <link>http://blogs.ugidotnet.org/angellaa/archive/2008/02/27/91400.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;&lt;br /&gt;Area di riferimento&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt;- Implementing service processes, threading, and application domains in a .NET Framework application &lt;br /&gt;   - Develop multithreaded .NET Framework applications &lt;br /&gt;      - Interlocked class&lt;br /&gt;      - Monitor class  &lt;/p&gt;&lt;hr /&gt;  &lt;p&gt;&lt;strong&gt;&lt;br /&gt;Thread Synchronization&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt;Tutti i thread all'interno del sistema possono avere accesso a risorse condivise come le porte seriali, i file, le finestre ecc. Se un thread richiede l'accesso esclusivo a una risorsa tutti gli altri thread  che hanno bisogno della stessa risorsa non potranno continuare il proprio lavoro. Per prevenire che una risorsa condivisa venga corrotta da più thread i programmatori devono utilizzare opportuni costrutti per la gestione della sincronizzazione. Microsoft Windows e il Common Language Runtime offrono molti costrutti. La maggior parte dei costrutti di sincronizzazione fra thread nel CLR sono giusto delle classi wrapper su costrutti di sincronizzazione di Win32. Infatti i threads del CLR non sono altro che dei thread di Windows e quindi questo significa che è Windows a schedulare e controllare la sincronizzazione tra i threads.  &lt;/p&gt;&lt;p&gt;Il modo più veloce e più semplice per manipolare dati in modo thread-safe è utilizzare la famiglia di metodi interlocked.  La classe &lt;strong&gt;Interlocked&lt;/strong&gt; definisce un certo insieme di metodi statici che posso in modo atomico modificare una variabile.  &lt;/p&gt;&lt;p&gt;Vediamo la dichiarazione della classe Interlocked:  &lt;/p&gt;&lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;public static class &lt;font color="#ff0000"&gt;Interlocked&lt;/font&gt;&lt;br /&gt;{ &lt;br /&gt;&lt;font color="#008000"&gt;    // Esegue in modo atomico location++&lt;br /&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;    public static extern int Increment(ref int location);&lt;br /&gt;    &lt;/strong&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;public static extern long Increment(ref long location);&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;    // Esegue in modo atomico location--&lt;br /&gt;&lt;/font&gt;    public static extern int Decrement(ref int location);&lt;br /&gt;    &lt;/strong&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;public static extern long Decrement(ref long location);&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt; &lt;p&gt; &lt;font face="Courier New"&gt;&lt;strong&gt;   &lt;font color="#008000"&gt;// Esegue in modo atomico location1 += value&lt;/font&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;    public static int Add(ref int location1, int value);&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;    public static long Add(ref long location1, long value);&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;    // Esegue in modo atomico: if ( location1 == comparand ) location1 = value;&lt;br /&gt;&lt;/font&gt;    public static extern int CompareExchange(ref int location1, int value, int comparand);&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;    public static T CompareExchange&amp;lt;T&amp;gt;(ref T location1, T value, T comparand) where T: class;&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;    public static extern double CompareExchange(ref double location1, double value, double comparand);&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;    public static extern long CompareExchange(ref long location1, long value, long comparand);&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;    public static extern IntPtr CompareExchange(ref IntPtr location1, IntPtr value, IntPtr comparand);&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;    public static extern object CompareExchange(ref object location1, object value, object comparand);&lt;br /&gt;    &lt;/strong&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;public static extern float CompareExchange(ref float location1, float value, float comparand);&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;    // Esegue in modo atomico: location1 = value&lt;br /&gt;&lt;/font&gt;    public static extern double Exchange(ref double location1, double value);&lt;br /&gt;    &lt;/strong&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;public static extern int Exchange(ref int location1, int value);&lt;br /&gt;    &lt;/strong&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;public static extern long Exchange(ref long location1, long value);&lt;br /&gt;    &lt;/strong&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;public static extern IntPtr Exchange(ref IntPtr location1, IntPtr value);&lt;br /&gt;    &lt;/strong&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;public static extern object Exchange(ref object location1, object value);&lt;br /&gt;    &lt;/strong&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;public static extern float Exchange(ref float location1, float value);&lt;br /&gt;    &lt;/strong&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;public static T Exchange&amp;lt;T&amp;gt;(ref T location1, T value) where T: class;&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;br /&gt;Il principale problema della classe Interlocked è che permette di lavorare solo su un piccolo insieme di tipi .NET.  &lt;/p&gt; &lt;p&gt;La classe &lt;strong&gt;Monitor&lt;/strong&gt; permette di gestire l'accesso in mutua esclusione a una risorsa che rappresenta la forma più comune di sincronizzazione tra thread. L'utilizzo della classe Monitor è molto semplice basta infatti racchiure il codice che rappresenta la sezione critica all'interno delle chiamate ai metodi &lt;strong&gt;Enter&lt;/strong&gt; ed &lt;strong&gt;Exit&lt;/strong&gt;. Il linguaggio C# offre una sintassi speciale equivalente che utilizza la parola chiave lock. I seguenti due metodi sono equivalenti:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;private void Metodo()&lt;br /&gt;{&lt;br /&gt;    Object temp = this;&lt;br /&gt;    &lt;font color="#ff0000"&gt;Monitor.Enter(temp);&lt;/font&gt;&lt;br /&gt;    try&lt;br /&gt;    {&lt;br /&gt;        &lt;font color="#008000"&gt;// Sezione critica&lt;br /&gt;&lt;/font&gt;    }&lt;br /&gt;    finally&lt;br /&gt;    {&lt;br /&gt;       &lt;font color="#ff0000"&gt;Monitor.Exit(temp);&lt;/font&gt;&lt;br /&gt;    }&lt;br /&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;private void Metodo()&lt;br /&gt;{&lt;br /&gt;    &lt;font color="#ff0000"&gt;lock&lt;/font&gt; (this)&lt;br /&gt;    {&lt;br /&gt;       &lt;font color="#008000"&gt;// Sezione critica&lt;br /&gt;&lt;/font&gt;    }&lt;br /&gt;} &lt;/strong&gt;&lt;/font&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;br /&gt;Utilizzando la classe Monitor è estremamente importante gestire le eccezioni per assicurare che il lock venga sempre rilasciato in modo da evitare una probabile situazione di &lt;strong&gt;deadlock&lt;/strong&gt;. Utilizzare lo statment lock semplifica molto le cose in quanto sarà il compilatore a scrivere questo codice difensivo per noi.&lt;/p&gt; &lt;p&gt;L'oggetto passato ai metodi Enter ed Exit rappresenta l'oggetto utilizzato per la gestione della sincronizzazione. Ciascun reference-type ha una struttura associata ad esso chiamata &lt;strong&gt;sync block index&lt;/strong&gt; che contiene un intero che rappresenta un indice all'interno di un &lt;strong&gt;array di sync blocks&lt;/strong&gt; gestito dal CLR. Un &lt;strong&gt;sync block&lt;/strong&gt; è un pezzo di memoria che può essere associato ad un oggetto. Quando un oggetto è costruito, il synch block index è inizializzato con un numero negativo per indicare che non "punta" a nessun sync block. Poi, quando si esegue il metodo Enter il CLR trova un sync block libero nell'array e setta il sync block index in modo che punti al sync block selezionato. Quando tutti i thread hanno rilasciato un sync block il sycn block index dell'oggetto è resettato a un valore negativo e il sycn block è considerato libero per essere associato in futuro ad un altro oggetto.&lt;/p&gt; &lt;p&gt;La migliore soluzione per risolver il problema della sincronizzazione e per evitare spiacevoli situazioni di deadlock è istanziare un oggetto privato all'interno della classe con il solo scopo di essere utilizzato come parametro per lo statment lock. In questo modo nessuno potrà accedere a tale campo e la gestione della sincronizzazione è demandata esclusivamente allo sviluppatore della classe stessa.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/angellaa/aggbug/91400.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Angella</dc:creator>
            <guid>http://blogs.ugidotnet.org/angellaa/archive/2008/02/27/91400.aspx</guid>
            <pubDate>Wed, 27 Feb 2008 17:13:02 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/angellaa/archive/2008/02/27/91400.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/angellaa/comments/commentRss/91400.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/angellaa/services/trackbacks/91400.aspx</trackback:ping>
        </item>
        <item>
            <title>[70-536] - The Asynchronous Programming Model (APM)</title>
            <link>http://blogs.ugidotnet.org/angellaa/archive/2008/02/26/91369.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;&lt;br /&gt;Area di riferimento&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt;- Implementing service processes, threading, and application domains in a .NET Framework application &lt;br /&gt;   - Develop multithreaded .NET Framework applications &lt;br /&gt;      - IAsyncResult interface (Refer System namespace)&lt;br /&gt;&lt;/p&gt; &lt;p&gt; &lt;/p&gt;&lt;hr /&gt;  &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;The Asynchronous Programming Model (APM)&lt;/font&gt;&lt;/strong&gt;  &lt;/p&gt;&lt;p&gt;Eseguire operazioni in modo asincrono è la chiave per la costruzione di applicazioni scalabili e con alte performance. Il team di Microsoft del CLR ha progettato un pattern che rende semplice allo sviluppatore l'utilizzo della programmazione asincrona. Molte classi del framework supportano l'APM fornedo metodi del tipo &lt;strong&gt;BeginXXX&lt;/strong&gt; e &lt;strong&gt;EndXXX&lt;/strong&gt;. Ad esempio la classe FileStream ha un metodo &lt;strong&gt;Read&lt;/strong&gt; che legge i dati dallo stream e fornisce i metodi &lt;strong&gt;BeginRead&lt;/strong&gt; ed &lt;strong&gt;EndRead&lt;/strong&gt; in modo da poter eseguire la stessa operazione in modo asincrono.&lt;/p&gt; &lt;p&gt;Eseguire operazioni di I/O in modo sincrono è molto inefficiente perchè il tempo necessario per effettuare l'operazione non è prevedibile e il thread chiamante viene sospeso e quindi diventa incapace di continuare il suo lavoro sprecando risorse. Il metodo BeginRead invece accoda una richiesta al driver del dispositivo di I/O che comunicherà direttamente all'hardware l'operazione da svolgere in modo da rendere libero il thread chiamante di continuare il suo lavoro.&lt;/p&gt; &lt;p&gt;Il modello APM supporta tre tecniche di rendezvous: &lt;strong&gt;wait-until-done&lt;/strong&gt;, &lt;strong&gt;polling&lt;/strong&gt; e &lt;strong&gt;method&lt;/strong&gt; &lt;strong&gt;callback&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Wait-Until-Done&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Per iniziare una operazione asincrona basta chiamare il metodo BeginXXX. Tutti questi metodi accodano l'operazione desiderata e ritornano un oggetto &lt;strong&gt;IAsyncResult&lt;/strong&gt; che identifica la richiesta pendente. Per ottenere il risultato dell'operazione è possibile semplicemente chiamare il corrispondente metodo EndXXX passando come parametro l'oggetto IAsyncResult. Se l'operazione asincrona è stata completata quando viene chiamato il metodo EndXXX questo ritornerà immediatamente altrimenti il thread chiamante viene sospeso fino a quando l'operazione non sarà completata. &lt;/p&gt; &lt;p&gt;Ecco un esempio che mostra l'utilizzo di questa tecnica:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;strong&gt;&lt;font color="#008000"&gt;&lt;br /&gt;&lt;font face="Courier New"&gt;// Apro il file specificando che si desidera effettuare I/O in modo asincrono&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;&lt;font face="Courier New"&gt;FileStream fs = new FileStream(@"dati.dat", FileMode.Open, FileAccess.Read,&lt;br /&gt;                                            FileShare.Read, 1024, &lt;font color="#ff0000"&gt;FileOptions.Asynchronous&lt;/font&gt;); &lt;/font&gt;&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font face="Courier New"&gt;Byte[] buffer = new Byte[100]; &lt;/font&gt;&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font face="Courier New"&gt;&lt;font color="#008000"&gt;// Inizia l'operazione di lettura asincrona&lt;/font&gt;&lt;br /&gt;&lt;font color="#ff0000"&gt;IAsyncResult&lt;/font&gt; ar = fs.&lt;font color="#ff0000"&gt;BeginRead&lt;/font&gt;(buffer, 0, buffer.Length, null, null); &lt;/font&gt;&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font face="Courier New"&gt;&lt;font color="#008000"&gt;// Effettua qualche altra operazione...&lt;/font&gt; &lt;/font&gt;&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font face="Courier New"&gt;&lt;font color="#008000"&gt;// Sospende questo thread fino al completamento dell'operazione e ottiene i risultati&lt;/font&gt;&lt;br /&gt;Int32 byteLetti = fs.&lt;font color="#ff0000"&gt;EndRead&lt;/font&gt;(&lt;font color="#ff0000"&gt;ar&lt;/font&gt;); &lt;/font&gt;&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font face="Courier New"&gt;&lt;font color="#008000"&gt;// Non ci sono altre operazioni quindi si chiude il file.&lt;/font&gt;&lt;br /&gt;fs.Close(); &lt;/font&gt;&lt;/strong&gt; &lt;/p&gt;&lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;&lt;font face="Courier New"&gt;&lt;font size="2"&gt;&lt;font color="#008000"&gt;// Visualizzazione dei risultati&lt;/font&gt;&lt;br /&gt;Console.WriteLine("Numero di byte letti: {0}", byteLetti);&lt;br /&gt;Console.WriteLine(BitConverter.ToString(buffer, 0, byteLetti));&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Polling&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;L'interfaccia IAsyncResult è così definita:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;[ComVisible(true)]&lt;br /&gt;public interface IAsyncResult&lt;br /&gt;{&lt;br /&gt;    // Properties&lt;br /&gt;    object AsyncState { get; }&lt;br /&gt;    WaitHandle AsyncWaitHandle { get; }&lt;br /&gt;    bool CompletedSynchronously { get; }&lt;br /&gt;    &lt;font color="#ff0000"&gt;bool IsCompleted { get; }&lt;br /&gt;&lt;/font&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;br /&gt;La proprietà &lt;strong&gt;IsCompleted&lt;/strong&gt; può essere utilizzata dallo sviluppatore utilizzando la tecnica del polling. Questa proprietà permette allo sviluppatore di sapere se l'operazione asincrona è stata completata ma senza bloccare il thread chiamante. Vediamo un esempio di utilizzo:  &lt;/p&gt;&lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Apro il file specificando che si desidera effettuare I/O in modo asincrono&lt;/font&gt;&lt;br /&gt;FileStream fs = new FileStream(@"dati.dat", FileMode.Open, FileAccess.Read,&lt;br /&gt;                                            FileShare.Read, 1024, FileOptions.Asynchronous); &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;Byte[] buffer = new Byte[100]; &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Inizia l'operazione di lettura asincrona&lt;br /&gt;&lt;/font&gt;IAsyncResult ar = fs.BeginRead(buffer, 0, buffer.Length, null, null); &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;while (!&lt;font color="#ff0000"&gt;ar.IsCompleted&lt;/font&gt;)&lt;br /&gt;{&lt;br /&gt;  &lt;font color="#008000"&gt;  // Effettua qualche altra operazione...&lt;br /&gt;&lt;/font&gt;} &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Ottiene i risultati dell'operazione asincrona (non è bloccante!)&lt;br /&gt;&lt;/font&gt;Int32 byteLetti = &lt;font color="#ff0000"&gt;fs.EndRead(ar);&lt;/font&gt; &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Non ci sono altre operazioni quindi si chiude il file.&lt;br /&gt;&lt;/font&gt;fs.Close(); &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Visualizzazione dei risultati&lt;/font&gt;&lt;br /&gt;Console.WriteLine("Numero di byte letti: {0}", byteLetti);&lt;br /&gt;Console.WriteLine(BitConverter.ToString(buffer, 0, byteLetti));&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;&lt;/font&gt;&lt;/strong&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;font size="3"&gt;Method Callback&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;Questa è la tecnica migliore quando si progetta una applicazione per performance e scalabilità. Il motivo è che questa tecnica non causa mai la sospensione del thread chiamante (al contrario della tecnica wait-until-done) e perchè questa tecnica non spreca mai tempo di CPU per controllare periodicamente se l'operazione asincrona è stata completata ( al contrario della tecnica del polling ).&lt;/p&gt; &lt;p&gt;Per prima cosa la richiesta di I/O asincrona viene accodata e il thread continua a svolgere il proprio lavoro. Quando la richiesta di I/O termina, Windows accoda un work item all'interno del thread pool del CLR. Un thread del pool preleverà il work item e chiamerà un metodo che lo sviluppatore ha scritto; questo è il modo in cui si viene a conoscenza che l'operazione richiesta è stata completata. A questo punto all'interno del metodo di callback è possibile chiamare il metodo EndXXX per ottenere il risultato dell'operazione in modo che possa essere elaborato secondo la logica applicativa. Quando il metodo ritorna, il thread del pool diventa libero di servire ulteriori richieste.&lt;/p&gt; &lt;p&gt;Vediamo un esempio di codice che utilizza questa tecnica:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;&lt;font color="#008000"&gt;// Il buffer è statico così che possa essere acceduto dal Main e dal metodo ReadDone&lt;/font&gt;&lt;br /&gt;&lt;font color="#ff0000"&gt;private static Byte[] buffer = new Byte[100];&lt;/font&gt; &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;static void Main(string[] args)&lt;br /&gt;{&lt;br /&gt;    &lt;font color="#008000"&gt;// Apro il file specificando che si desidera effettuare I/O in modo asincrono&lt;br /&gt;&lt;/font&gt;    FileStream fs = new FileStream(@"dati.dat", FileMode.Open, FileAccess.Read,&lt;br /&gt;                                                FileShare.Read, 1024, FileOptions.Asynchronous);            &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;    &lt;font color="#008000"&gt;// Inizia l'operazione di lettura asincrona&lt;br /&gt;&lt;/font&gt;    IAsyncResult ar = fs.BeginRead(buffer, 0, buffer.Length, &lt;font color="#ff0000"&gt;fineLettura&lt;/font&gt;, &lt;font color="#ff0000"&gt;fs&lt;/font&gt;); &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;    &lt;font color="#008000"&gt;// Altre operazioni...&lt;br /&gt;&lt;/font&gt;    Console.ReadKey();          &lt;br /&gt;} &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;static void fineLettura(&lt;font color="#ff0000"&gt;IAsyncResult&lt;/font&gt; ar)&lt;br /&gt;{&lt;br /&gt;    &lt;font color="#008000"&gt;// Estrae il FileStream (lo stato) dell'oggetto IAsyncResult&lt;br /&gt;&lt;/font&gt;    FileStream fs = &lt;font color="#ff0000"&gt;ar.AsyncState&lt;/font&gt; as FileStream; &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;    &lt;font color="#008000"&gt;// Ottiene il risultato dell'operazione&lt;br /&gt;&lt;/font&gt;    Int32 byteLetti = fs.EndRead(ar); &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt; &lt;font color="#008000"&gt;   // Non ci sono altre operazioni quindi si chiude il file.&lt;/font&gt;&lt;br /&gt;    fs.Close(); &lt;/strong&gt;&lt;/font&gt; &lt;/p&gt;&lt;p&gt;&lt;font face="Courier New"&gt;&lt;strong&gt;    &lt;font color="#008000"&gt;// Visualizzazione dei risultati&lt;/font&gt;&lt;br /&gt;    Console.WriteLine("Numero di byte letti: {0}", byteLetti);&lt;br /&gt;    Console.WriteLine(BitConverter.ToString(buffer, 0, byteLetti));&lt;br /&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&lt;br /&gt;Affinchè all'interno del Main e del metodo ReadDone sia possibile accedere al contenuto del buffer nell'esempio si è utilizzato un buffer statico. Questa scelta in pratica non dovrebbe essere fatta in quanto non permette estensioni future. E' più corretto procedere alla costruzione di una classe che contiene il buffer e il campo FileStream in modo da poter passare un riferimento ad una sua istanza come ultimo parametro del metodo BeginRead. Questo riferimento è infatti accessibile nel metodo di callback accedendo alla proprietà AsyncState dell'oggetto IAsyncResult. In particolare questa proprietà permette di ottenere un riferimento all'oggetto sul quale è stato eseguito il metodo BeginRead in modo da poter chiamare correttamente il metodo EndRead.&lt;/p&gt; &lt;p&gt;E' estremamente importante chiamare sempre il metodo EndXXX all'interno del metodo di callback per evitare uno spreco di risorse ma soprattutto per sapere se l'operazione richiesta è stata completata correttamente o meno. Nel caso in cui si sia verificato un errore la chiamata al metodo EndXXX solleverà una eccezione che andrà opportunamente gestita.&lt;/p&gt; &lt;p&gt;&lt;font size="3"&gt;&lt;strong&gt;Note&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;p&gt;Alcuni metodi BeginXXX potrebbero ritornare un oggetto che implementa l'interfaccia IAsyncResult e che offre qualche tipo di metodo cancel. In questo caso significa che il thread corrente può cancellare l'operazione asincrona richiesta.&lt;/p&gt; &lt;p&gt;In Windows, una finestra è sempre creata da un thread e questo thread deve essere utilizzato per processare tutte le azioni per la finestra stessa (WM_MOVE, WM_PAINT, ecc.). &lt;br /&gt;In quanto le Windows Forms sono costruite al di sopra di Windows, ad un thread non è permesso di accedere direttamente agli oggetti definiti nella form o in generale a una classe derivata da Control. Per questo motivo i controlli offrono tre metodi (&lt;strong&gt;Invoke&lt;/strong&gt;, &lt;strong&gt;BeginInvoke&lt;/strong&gt; e &lt;strong&gt;EndInvoke&lt;/strong&gt;) in modo che possa essere effettuato il marshal di una operazione dal thread chiamante al thread che ha creato la finestra.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/angellaa/aggbug/91369.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Angella</dc:creator>
            <guid>http://blogs.ugidotnet.org/angellaa/archive/2008/02/26/91369.aspx</guid>
            <pubDate>Tue, 26 Feb 2008 21:50:20 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/angellaa/archive/2008/02/26/91369.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/angellaa/comments/commentRss/91369.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/angellaa/services/trackbacks/91369.aspx</trackback:ping>
        </item>
        <item>
            <title>[70-536] - Timer</title>
            <link>http://blogs.ugidotnet.org/angellaa/archive/2008/01/03/90550.aspx</link>
            <description>&lt;p&gt;&lt;strong&gt;Area di riferimento&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;- Implementing service processes, threading, and application domains in a .NET Framework application    &lt;br /&gt;   - Develop multithreaded .NET Framework applications     &lt;br /&gt;      - Timer class, TimerCallback delegate&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;&lt;strong&gt;     &lt;br /&gt;Timer&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;L'oggetto &lt;strong&gt;Timer&lt;/strong&gt; del namespace &lt;strong&gt;System.Threading&lt;/strong&gt; è il miglior timer da usare quando si vogliono eseguire in background dei task periodici.&lt;/p&gt;  &lt;p&gt;Quando si costruisce una istanza di un oggetto Timer si specificano le seguenti informazioni:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Metodo da richiamare periodicamente (deve rispettare la firma del delegate &lt;strong&gt;TimerCallback&lt;/strong&gt; )&lt;/li&gt;    &lt;li&gt;Informazioni da passare al metodo di callback&lt;/li&gt;    &lt;li&gt;Tempo di attesa prima di invocare per la prima volta il metodo di callback&lt;/li&gt;    &lt;li&gt;Periodo di tempo tra due chiamate consecutive del metodo di callback&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Ecco un esempio di utilizzo:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;class Program         &lt;br /&gt;{          &lt;br /&gt;    static void Main(string[] args)          &lt;br /&gt;    {          &lt;br /&gt;        &lt;font color="#008000"&gt;// Costruisco un nuovo timer&lt;/font&gt;          &lt;br /&gt;        &lt;font color="#ff0000"&gt;Timer timer = new Timer(timer_callback, "Ciao a tutti", 1000, 2000);&lt;/font&gt; &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;        &lt;strong&gt;Console.WriteLine("{0}: {1}", DateTime.Now.ToLongTimeString(), "Creazione Timer");&lt;/strong&gt; &lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;        Console.ReadKey(); &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;        &lt;font color="#008000"&gt;// Rilascia le risorse allocate al Timer.            &lt;br /&gt;        // (necessario per evitare che il garbage collector distrugga l'oggetto timer non più referenziato)            &lt;br /&gt;&lt;/font&gt;        timer.Dispose();          &lt;br /&gt;    } &lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font face="Courier New" size="2"&gt;&lt;strong&gt;    &lt;font color="#008000"&gt;// Metodo che sarà eseguito periodicamente&lt;/font&gt;          &lt;br /&gt;    &lt;font color="#ff0000"&gt;static void timer_callback(object state)           &lt;br /&gt;&lt;/font&gt;    {          &lt;br /&gt;        string messaggio = state as string;          &lt;br /&gt;        Console.WriteLine("{0}: {1}", DateTime.Now.ToLongTimeString(), messaggio);          &lt;br /&gt;    }          &lt;br /&gt;}&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;   &lt;br /&gt;Output del programma:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;font face="Courier New" color="#800000" size="2"&gt;&lt;strong&gt;22.43.27: Creazione Timer         &lt;br /&gt;22.43.28: Ciao a tutti          &lt;br /&gt;22.43.30: Ciao a tutti          &lt;br /&gt;22.43.32: Ciao a tutti          &lt;br /&gt;22.43.34: Ciao a tutti          &lt;br /&gt;22.43.36: Ciao a tutti&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://blogs.ugidotnet.org/angellaa/aggbug/90550.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Andrea Angella</dc:creator>
            <guid>http://blogs.ugidotnet.org/angellaa/archive/2008/01/03/90550.aspx</guid>
            <pubDate>Thu, 03 Jan 2008 23:47:54 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/angellaa/archive/2008/01/03/90550.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/angellaa/comments/commentRss/90550.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/angellaa/services/trackbacks/90550.aspx</trackback:ping>
        </item>
    </channel>
</rss>