Around and About .NET World

Il blog di Marco Minerva
posts - 1671, comments - 2232, trackbacks - 2135

My Links

News

Contattami su Live Messenger:


MCTS: Windows, Web, Distributed Applications & SQL Server

MCPD: Enterprise Applications

Tag Cloud

Archives

Post Categories

Links

Thread ed eventi

Abbiamo una classe che dispone di un metodo Start il quale, una volta richiamato, esegue un'operazione piuttosto complessa in un thread separato. Quest'ultimo può generare alcuni eventi per notificare all'applicazione che utilizza tale classe il verificarsi di certe condizioni. In una situazione del genere, poiché gli eventi sono lanciati da un thread separato, se nell'handler dell'evento si vuole modificare qualche oggetto dell'interfaccia, bisogna usare il meccanismo di Invoke per avere un accesso thread-safe ai controlli. Così facendo, in pratica sono necessarie due routine per ogni evento che si vuole gestire.

Se si utilizza il .NET Framework 2.0, è possibile adottare una soluzione alternativa che permette di lanciare gli eventi direttamente nel thread che gestisce l'interfaccia utente, risparmiando quindi l'utilizzo di Invoke. Bisogna innanzi tutto strutturare la classe che contiene il thread nel modo seguente:

1 using System; 2 using System.Threading; 3 using System.ComponentModel; 4 5 public class Worker 6 { 7 private AsyncOperation operation; 8 private SendOrPostCallback callback; 9 10 public event EventHandler MyEvent; 11 12 public Worker() 13 { 14 callback = new SendOrPostCallback(Callback); 15 } 16 17 public void Start(object stateInfo) 18 { 19 operation = AsyncOperationManager.CreateOperation(null); 20 Thread t = new Thread(DoWork); 21 t.Start(stateInfo); 22 } 23 24 private void DoWork(object stateInfo) 25 { 26 for (int i = 0; i < 5; i++) 27 { 28 Thread.Sleep(1000); 29 operation.Post(callback, i); 30 } 31 } 32 33 private void Callback(object stateInfo) 34 { 35 //Questo metodo viene eseguito nel thread che gestisce l'interfaccia. 36 int value = (int)stateInfo; 37 if (MyEvent != null) 38 MyEvent(this, EventArgs.Empty); 39 } 40 }

Il suo funzionamento ruota intorno agli oggetti AsyncOperation e SendOrPostCallback. L'utilizzo di questa classe è semplice:

Worker w = new Worker(); w.MyEvent += new EventHandler(w_MyEvent); w.Start(null); //... int i = 0; void w_MyEvent(object sender, EventArgs e) { label1.Text = (++i).ToString(); //Corretto. }

L'evento MyEvent viene generato nello stesso thread  in cui gira l'interfaccia utente (righe 33-39), quindi nella sua routine di gestione è possibile modificare direttamente gli oggetti del form, senza incorrere nell'errore InvalidOperationException.

Print | posted on Wednesday, February 14, 2007 3:16 PM | Filed Under [ C# ]

Feedback

Gravatar

# Sapere quando

Sapere quando
12/27/2007 12:39 AM | Around and About .NET World
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET