Prova questo.
class Form1: Form
{
public void ButtonWasClicked(object sender, EventArgs e)
{
/* Call the UI's Invoke() method */
this.Invoke((MethodInvoker)delegate()
{
/* Stuff to do.. you can access UI elements too without
* the nasty "Control accessed from another thread.."
* Use BeginInvoke() only if you have code after this section
* that you want the UI to execute without waiting for this
* inner blockto finish.
*/
});
}
}
Riguardo BeginInvoke(), esso viene utilizzato in modo che la funzione ritorna immediatamente e la riga successiva sarà eseguito e così via e così via senza attendere che il metodo per terminare.
La differenza è che se si crea un thread si avrà più controllo su di esso proprio come qualsiasi altro thread. Ti imbatterai in CrossThreadExceptions! Considerando che se si utilizza IAsyncResult e BeginInvoke(), non si avrà il controllo sul flusso di esecuzione dell'operazione asincrona come viene gestito dal runtime.
Con invocazione è inoltre possibile inviare più parametri a un metodo e richiamare un metodo una volta terminata l'operazione.
MyDelegateWithTwoParam del = new MyDelegateWithTwoParam(_method);
AsyncCallback callback = new AsyncCallback(_callbackMethod);
IAsyncResult res = del.BeginInvoke(param1, param2, callback, null);
private void _callbackMethod(IAsyncResult iar) {
/* In this method you can collect data that your operation might have returned.
* If MyDelegateWithTwoParam has a return type, you can find out here what i was. */
}
Ho ampiamente utilizzato entrambi per lo sviluppo dell'interfaccia utente. Vorrei usare i thread più per oggetti di tipo servizio. (Pensa a un oggetto che rimane e ascolta le connessioni TCP) e ai metodi asincroni per il lavoro in background dietro un'interfaccia utente (dai un'occhiata anche a BackgroundWorker). Non preoccuparti se il primo approccio ha richiesto un secondo in più per iniziare: Thread.Abort() non è la sempre la soluzione migliore. Prova _abort flags nel tuo codice di processo e bloccalo.
Spero di aver risposto alla domanda.
Leone Bruzzaniti
fonte
2009-08-04 11:47:47
Per informazioni, è utile chiarire se si intende Control.BeginInvoke e Delegate.BeginInvoke; Credo che tu intenda il primo, ma sono degli opposti quasi esatti, quindi la differenza è importante. –
è il primo approccio (Control.BeginInvoke), poiché sto facendo questo su un modulo. –