Estoy intentando el async CTP, la versión 4.5 que permite utilizar métodos asíncronos sin necesidad de escribir los métodos Begin/End.Cuando el método devuelve vacío, ¿es lo mismo que una tarea?
Mi primera prueba es ejecutar un método asíncrono que devuelve vacío. Puedo ver algunos ejemplos y hacer lo siguiente:
private void btnAsync01_Click(object sender, RoutedEventArgs e)
{
UpdateTxtLog("click button: " + System.DateTime.Now);
method01Async();
UpdateTxtLog("after ethod01Async: " + System.DateTime.Now);
}
private async void method01Async()
{
await TaskEx.Run(() =>
{
UpdateTxtLog("Enter method01Async: " + System.DateTime.Now);
Thread.Sleep(10000);
UpdateTxtLog("exit method01Async: " + System.DateTime.Now);
});
}
En mi proyecto WPF tengo un cuadro de texto donde ver los resultados y un botón que ejecuta el método asíncrono.
En el método asíncrono, uso await, es necesario porque el método es asíncrono, y TasEx.Run para crear un nuevo hilo en el que ejecutar el código.
Mi duda es en este punto. En algunos ejemplos que veo de cómo crear un método asíncrono que devuelve vacío, use de esta manera, Task.Run o TaskEx.Run.
Si no me equivoco, Task.Run crea un nuevo hilo donde ejecutar el método. Entonces, ¿por qué usar un método asíncrono, si con la Tarea, crear un nuevo hilo, obtengo lo que quiero, no para bloquear el hilo principal?
Además, si el método asíncrono accede a alguna variable compartida, debo tener cuidado con la concurrencia, ¿verdad? Por lo tanto, no conozco la ventaja de utilizar métodos asíncronos, al menos en este caso.
De hecho, utilizo el mismo código sin async y sin esperar y el resultado es el mismo, el programa principal no está bloqueando y todo funciona como esperaba. El método es el siguiente:
private void method01Async()
{
TaskEx.Run(() =>
{
UpdateTxtLog("Enter method01Async: " + System.DateTime.Now);
Thread.Sleep(10000);
UpdateTxtLog("Exit method01Async: " + System.DateTime.Now);
});
}
Mi pregunta es, esta es la forma correcta de utilizar asíncrono cuando el retorno void método?
Por cierto, el Visual Studio 11 Beta está ahora fuera, que contiene las características de la CTP asíncrono, con algunas mejoras y correcciones de errores. – svick
¿Y cuál es el beneficio de usar el método asincrónico en este caso, si en el método estoy usando una tarea, y la tarea usar un hilo niew? Si uso directamente una tarea, sin usar un método asíncrono, obtengo el comportamiento. Quizás los métodos asíncronos tengan más sentido si el método devuelve un valor y para los métodos nulos, ¿es mejor usar directamente una tarea? –
Recomiendo encarecidamente que todos los métodos 'async' devuelvan' Tarea' o 'Tarea' a menos que sean manejadores de eventos y * tengan * para devolver' void'. Esto le permite componerlos si es necesario y el manejo de errores también es más limpio (si un método 'async void' genera una excepción en un contexto WPF, se envía directamente al bucle de mensajes de UI, por lo que los métodos' async void' son * no * verdaderamente "dispara y olvida"). –