Conoscere se il codice è in esecuzione sul thread principale in Silverlight 4.0

di Alessio Leoncini, in Silverlight 3.0, Silverlight 4.0,

Nell'ambito dello sviluppo con Silverlight è molto frequente sfruttare le caratteristiche del modello di programmazione multi-threading, sia in modo implicito, nell'utilizzo di web services che in modo esplicito, qualora si vogliano eseguire alcune operazioni in parallelo rispetto al thread principale, quello dell'interfaccia utente.

In entrambi i casi, all'interno di un thread parallelo è possibile comunicare con gli oggetti dell'interfaccia utente, residenti nel thread principale, solo attraverso l'oggetto Dispatcher ad esso collegato ed il suo metodo BeginInvoke.

Poichè l'intercomunicazione tra i thread, come detto attraverso l'oggetto Dispatcher, richiede una certa quantità di risorse, non sempre trascurabile, può essere utile conoscere se un certo codice viene richiamato dal thread
principale o da uno parallelo, in modo da utilizzare all'occorrenza il metodo BeginInvoke o meno. Per questa operazione è possibile utilizzare il metodo CheckAccess, sempre dell'oggetto Dispatcher esposto dalla proprietà Current di Deployment.

E' possibile vedere un esempio nello snippet seguente, nel quale si può apprezzare anche il tempo impiegato in più nell'elaborazione attraverso il Dispatcher.

C#
Thread t = new Thread(() =>
{
  bool isUIThread = Deployment.Current.Dispatcher.CheckAccess();

  if (!Deployment.Current.Dispatcher.CheckAccess())
    Deployment.Current.Dispatcher.BeginInvoke(() =>
    {
      tb2.Text = String.Format("{0} - {1}", isUIThread, DateTime.Now.Millisecond);
    });
});
t.Start();

tb1.Text = String.Format("{0} - {1}", Deployment.Current.Dispatcher.CheckAccess(), DateTime.Now.Millisecond);

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

Nessuna risorsa collegata

I più letti di oggi