<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Centralino Voip &#187; c</title>
	<atom:link href="http://centralino-voip.brunosalzano.com/category/archivio/programmazione/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://centralino-voip.brunosalzano.com</link>
	<description>Call Center, Contact Center, Voip, Centralino, asterisk, telefonia</description>
	<lastBuildDate>Sat, 27 Mar 2010 10:10:31 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Invoke</title>
		<link>http://centralino-voip.brunosalzano.com/invoke/</link>
		<comments>http://centralino-voip.brunosalzano.com/invoke/#comments</comments>
		<pubDate>Sun, 03 Sep 2006 18:12:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Archivio]]></category>
		<category><![CDATA[Programmazione]]></category>
		<category><![CDATA[c]]></category>

		<guid isPermaLink="false">http://www.brunosalzano.com/?p=3</guid>
		<description><![CDATA[Prima o poi vi capiterà  di sviluppare una applicazione che faccia uso dei Threads per svolgere operazioni in background.
Magari se non avete mai utilizzato i Threads, vi consiglio questo articolo (in inglese) An Introduction to Programming with C# Threads
Il problema dell&#8217;Invoke si presenta nel momento in cui cercate di aggiornare la UI di una [...]]]></description>
			<content:encoded><![CDATA[<p>Prima o poi vi capiterà  di sviluppare una applicazione che faccia uso dei Threads per svolgere operazioni in background.<br />
Magari se non avete mai utilizzato i Threads, vi consiglio questo articolo (in inglese) <a href="http://research.microsoft.com/research/pubs/view.aspx?type=Technical%20Report&amp;id=921" target="_blank">An Introduction to Programming with C# Threads</a></p>
<p>Il problema dell&#8217;Invoke si presenta nel momento in cui cercate di aggiornare la UI di una Form da un thread. Infatti   .NET consente l&#8217;invocazione delle funzioni dell&#8217;oggetto <code>System.Windows.Forms.Control</code> solo dal thread in cui l&#8217;oggetto è stato creato. Per aggirare l&#8217;ostacolo abbiamo bisogno di utilizzare le funzioni <code>Control.Invoke</code> (chiamata sincrona) or <code>Control.BeginInvoke</code> (chiamata asincrona). Normalmente, il nostro approccio sarebbe quello di scrivere tante delegates per quanti sono gli oggetti  da invocare o metodi da aggiornare:<br />
<code> delegate void AggiungiListboxDelegate(string msg);<br />
[...]<br />
if (this.InvokeRequired) {<br />
Invoke(new AggiungiListboxDelegate(AggiungiAListBox), new object[] { itm } );<br />
}<br />
else<br />
{<br />
AggiungiAListBox(itm);<br />
}<br />
</code></p>
<p>Esiste invece un metodo più semplice ed utilizzabile in modo generico nella maggior parte dei casi. Scriviamo delle delegates generiche che ricevono:</p>
<ul>
<li>o l&#8217;oggetto, il nome della property da valorizzare e il nuovo valore da assegnare</li>
<li>o l&#8217;oggetto, il nome del metodo da invocare e i parametri da passare al metodo</li>
</ul>
<p><code> delegate void SetPropertyDelegate(object ctl, string objName, object newValue);<br />
delegate void SetMethodDelegate(object obj, string methodName, object[] parameters);<br />
[...]</code></p>
<p><code> void SetProperty(object ctl, string propName, object newValue) {<br />
Type t = ctl.GetType();<br />
PropertyInfo pi = t.GetProperty(propName);</code></p>
<p>if (pi != null) {<br />
pi.SetValue(ctl,newValue,null);<br />
}<br />
}<br />
void SetMethod(object ctl, string methodName, object[] parameters) {<br />
Type t = ctl.GetType();<br />
MethodInfo mi = t.GetMethod(methodName);</p>
<p>if (mi != null) {<br />
mi.Invoke(ctl, parameters);<br />
}<br />
}<br />
Un esempio di utilizzo:</p>
<p><code>Invoke(new SetPropertyDelegate(SetProperty), new object[] { (object)lblErrMessage, "Text", errmsg });</code></p>
<p><code>oppure</code></p>
<p><code>Invoke(new SetMethodDelegate(SetMethod), new object[] { (object)this, "Close", (new object[] {}) } );</code></p>
<p>A voi l&#8217;onere di migliorare l&#8217;idea <img src='http://centralino-voip.brunosalzano.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<span class="slashdigglicious">
<a href="http://slashdot.org/bookmark.pl?url=http%3A%2F%2Fcentralino-voip.brunosalzano.com%2Finvoke%2F&amp;title=Invoke" title="Slashdot It!"><img src="http://slashdot.org/favicon.ico" height="16" width="16" alt="[Slashdot]" /></a>
<a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fcentralino-voip.brunosalzano.com%2Finvoke%2F&amp;title=Invoke" title="Digg This Story"><img src="http://digg.com/favicon.ico" width="16" height="16" alt="[Digg]" /></a>
<a href="http://reddit.com/submit?url=http%3A%2F%2Fcentralino-voip.brunosalzano.com%2Finvoke%2F&amp;title=Invoke" title="Reddit"><img src="http://reddit.com/favicon.ico" width="16" height="16" alt="[Reddit]" /></a>
<a href="http://del.icio.us/post?url=http%3A%2F%2Fcentralino-voip.brunosalzano.com%2Finvoke%2F&amp;title=Invoke" title="Save to del.icio.us" onclick="window.open('http://del.icio.us/post?v=4&amp;noui&amp;jump=close&amp;url=http%3A%2F%2Fcentralino-voip.brunosalzano.com%2Finvoke%2F&amp;title=Invoke', 'delicious', 'toolbar=no,width=700,height=400'); return false;"><img src="http://images.del.icio.us/static/img/delicious.small.gif" width="16" height="16" alt="[del.icio.us]" /></a>
<a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fcentralino-voip.brunosalzano.com%2Finvoke%2F" title="Share on Facebook"><img src="http://www.facebook.com/favicon.ico" width="16" height="16" alt="[Facebook]" /></a>
<a href="http://technorati.com/faves?add=http%3A%2F%2Fcentralino-voip.brunosalzano.com%2Finvoke%2F" title="Add to my Technorati Favorites"><img src="http://technorati.com/favicon.ico" width="16" height="16" alt="[Technorati]" /></a>
<a href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fcentralino-voip.brunosalzano.com%2Finvoke%2F&amp;title=Invoke" title="Save to Google Bookmarks"><img src="http://www.google.com/favicon.ico" width="16" height="16" alt="[Google]" /></a>
<a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fcentralino-voip.brunosalzano.com%2Finvoke%2F&amp;title=Invoke" title="Stumble it!"><img src="http://www.stumbleupon.com/favicon.ico" width="16" height="16" alt="[StumbleUpon]" /></a>
</span>]]></content:encoded>
			<wfw:commentRss>http://centralino-voip.brunosalzano.com/invoke/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
