[Compact .Net] Effettuare operazioni in background

Molto spesso le nostre applicazioni si trovano in situazioni di inoperatività dovute magari all'attesa di scelte dell'utente. Questi momenti ci offrono la possibilità di prepararci all'esecuzione di task futuri che magari sappiamo già impiegheranno molto tempo ad eseguirsi.
Il problemi maggiori li abbiamo con lo scarso supporto al threading offerto dal compact framework, che per esempio non ci permette di conoscere lo stato di esecuzione del thread. A tal proposito ho scritto una piccola classe in grado di lanciare l'esecuzione di un metodo in un thread separato, di sapere se l'operazione si è conclusa, e se dovesse essere necessario, attenderne la conclusione. Questa classe è in grado di eseguire metodi che non prevedono parametri e non ritornano valori.

using System;
using System.Collections;
using System.Threading;

class LoaderClass
{
Hashtable thread_table = new Hashtable();
Hashtable action_table = new Hashtable();

public int Run(Action action)
{
Thread t = new Thread(new ThreadStart(methodRunner));
thread_table.Add(t.ManagedThreadId, t);
action_table.Add(t.ManagedThreadId, action);
t.Start();
return t.ManagedThreadId;
}

public bool WorkEnded(int thread_id)
{
return thread_table.ContainsKey(thread_id);
}

public void WaitForEnd(int thread_id)
{
if (thread_table.ContainsKey(thread_id))
{
Thread t;
try
{ t = (Thread)thread_table[thread_id]; }
catch
{ return; }

t.Join();
}
}

private void methodRunner()
{
int thread_id = Thread.CurrentThread.ManagedThreadId;

Action action = (Action)action_table[thread_id];
action();

action_table.Remove(thread_id);
thread_table.Remove(thread_id);
}
}


Con questa classe possiamo per esempio lanciare in anticipo il caricamento dei dati dal database senza disturbare i funzionamento dell'applicativo, e nel momento in cui avremo bisogno dei dati, attendere la conclusione del'operazione (se già non è terminata).

es.

//Nel form_load
LoaderClass loader = new LoaderClass();
thread_id = loader.Run(load_data);

//Quando avremo bisogno dei dati
loader.WaitForEnd(thread_id);
//utilizza i dati caricati

0 commenti:

Posta un commento