Pruebe esto.
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.
*/
});
}
}
En cuanto BeginInvoke(), se utiliza por lo que la función devolverá inmediatamente y la línea siguiente será ejecutada y así sucesivamente y así sucesivamente sin esperar a que el método para terminar.
La diferencia es que si crea un hilo, tendrá más control sobre él como cualquier otro hilo. ¡Te encontrarás con CrossThreadExceptions! Mientras que si usa IAsyncResult y BeginInvoke(), no tendrá control sobre el flujo de ejecución de la operación asíncrona ya que es administrada por el tiempo de ejecución.
Con la invocación también puede enviar más parámetros a un método y llamar a un método una vez que la operación haya finalizado.
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. */
}
He utilizado ampliamente tanto para el desarrollo de la interfaz de usuario. Usaría hilos más para objetos similares a servicios. (Piense en un objeto que permanezca y escuche las conexiones TCP) y métodos asincrónicos para el trabajo de fondo detrás de una IU (eche un vistazo a BackgroundWorker también). No se preocupe si el primer enfoque tomó un segundo extra para comenzar: Thread.Abort() no es , siempre es la mejor solución tampoco. Pruebe _abort banderas en su código de proceso y bloquearlo.
Espero que haya respondido la pregunta.
Leo Bruzzaniti
Para obtener información, es útil dejar en claro si se refiere a Control.BeginInvoke y Delegate.BeginInvoke; Creo que te refieres al primero, pero son casi exactamente opuestos, por lo que la diferencia es importante. –
es el primer enfoque (Control.BeginInvoke), ya que estoy haciendo esto en un Formulario. –