Qualcuno può indicarmi come rendere asincrono un intero blocco di codice?
Grazie
Qualcuno può indicarmi come rendere asincrono un intero blocco di codice?
Grazie
Dipende da cosa intendi per asincrno.
Alcune classi del net framework presuppongono un achiamata asincrona ad un metodo..
Tu cosa vuoi fare?
Sto cercando di utilizzare i metodi BeginInvoke() e EndInvoke() per stampare a video una Form mentre eseguo una elaborazione. Sto utilizzando questa sintassi:
In pratica non stampa il contenuto della Form quindi c'è ben poco di asincrono . . .codice:public void Elaborazione() { ..... } public delegate void Elabora_Delegate(); private void Esegui(object sender, EventArgs e) { Elabora_Delegate delegato = new Elabora_Delegate(Elaborazione); IAsyncResult asyncResult = delegato.BeginInvoke(null, null); Globale.elaborazione.Show(); // Form con il messaggio asyncResult.AsyncWaitHandle.WaitOne(); delegato.EndInvoke(asyncResult); }
Dato che è la prima volta che uso questa sintassi, chiedo conferma della sua correttezza.
Perchè probabilmente ho sbagliato . . .![]()
Ma come parametro "AsyncCallBack callback" cosa dovrei passare? Come "object" penso nulla, il metodo richiamato non ha parametri di input e non ritorna nulla.
Prova a spiegare meglio cosa intendi fare e qual'è lo scopo.. detta così mi sembra più un tentativo accozzato che una cosa pensata.. crei un delegato di metodo, su questo fai una begininvoke con un null e poi mostri la form, dopo fai la endinvoke.. a ragionamento qui manca qualcosa..
Il punto è che è la prima volta che utilizzo i metodi BeginInvoke() e EndInvoke() e non mi è chiaro il funzionamento.
Quello che voglio fare è stampare a video una Form contenente la Label "Attendere prego" mentre effettuo le operazione presenti nel metodo Elabora().
Ora, sto facendo casino con la sintassi ok, vediamo nello specifico:
Ecco, spero di essere stato chiaro. Come AsyncCallBack e object cosa dovrei mettere? Ho controllato sul MSDN ma non mi è chiaro.codice:// Questo è il metodo che deve essere eseguito mentre la Form è visibile public void Elaborazione() { // Codice } // Delegato del metodo Elaborazione public delegate void Elabora_Delegate(); // Qui cerco di eseguire il codice ma la sintassi è errata private void Esegui ((object sender, EventArgs e) { Elabora_Delegate delegato = new Elabora_Delegate(Elaborazione); IAsyncResult asyncResult = delegato.BeginInvoke(?,?); // I parametri non mi sono chiari Globale.elaborazione.Show(); // Stampa della Form asyncResult.AsyncWaitHandle.WaitOne(); delegato.EndInvoke(asyncResult); }
Grazie.
allora.. premetto che non conosco questo metodo di programmazione e se fossi in te il metodo esegui lo metterei in un thread e nel thread principale (dopo lo show per intenderci) metterei un threadEsegui.Join() per attendere la sua conclusione..
Così facendo:
La Form viene stampa senza la Label, in pratica stampa la Form ma prima di stampare la Label passa al codice di Elaborazione().codice:Globale.elaborazione.Show(); Elaborazione();
Potresti usare il componente di nome BackgroundWorker che ti facilita la chiamata asincrona, la visualizzazione di un messaggio di attesa, l'eventuale cancellazione dell'operazione ecc. ecc.
http://msdn.microsoft.com/en-us/library/ms171728(VS.80).aspx
Saluti a tutti
Riccardo