2012-01-04 17 views
5

Uso de Visual Studio Async CTP (Versión 3) Me cuesta entender cómo puedo "ajustar" el código existente utilizando este marco.Conceptos básicos sobre el uso de Microsoft Async Framework

Por ejemplo

El uso de la biblioteca OpenPop.NET Estoy tratando de establecer una conexión con un servidor POP3 y confirmar que tengo un nombre de usuario y una contraseña válidos.

Digamos que tengo un código como este.

public bool ConnectSync() 
    { 
     bool success = true; 
     Pop3Client client = new Pop3Client(); 

     try 
     { 
      client.Connect("mail.server.com", 110, false); 
      client.Authenticate("username", "password"); 
     } 
     catch 
     { 
      success = false; 
     } 
     return success; 
    } 

Y ahora quiero que sea asíncrono mi entendimiento de lo que he estado leyendo y unir las piezas es que me gustaría terminar con una firma de método en la línea de

public async Task<bool> ConnectAsync() 
    { 

    } 

creo que esta es la firma correcta porque será una tarea que devuelva un valor booleano (?) y supongo que necesitaré utilizar el método TaskEx.Run()? pero eso es lo que yo puedo entender. ¿Alguien podría apuntar en la dirección correcta?

+0

Las cosas que se presentaron con Async CTP no son un marco AFAIK, ¿o sí? – tugberk

Respuesta

3

Sí, tienes razón hasta ahora.

La manera fácil de convertir su método es, como usted dice, simplemente envolverlo en TaskEx.Run para que el método se ejecute en un subproceso de grupo de subprocesos y no bloquee su subproceso de interfaz de usuario.

public Task<bool> ConnectAsync() 
{ 
    return TaskEx.Run(() => 
     { 
      bool success = true; 
      Pop3Client client = new Pop3Client(); 

      try 
      { 
       client.Connect("mail.server.com", 110, false); 
       client.Authenticate("username", "password"); 
      } 
      catch 
      { 
       success = false; 
      } 
      return success; 
     } 
    ); 
} 
3

Fundamentalmente, con el fin de obtener los mayores beneficios de la CTP asíncrono que realmente podría hacer con asíncrono llama todo el camino hacia abajo. Usted puede envolver su sincrónica métodoConnectSync en una tarea muy sencilla, sin necesidad de utilizar el CTP asíncrono en absoluto:

// Note: not an async method in itself 
public Task<bool> ConnectAsync() 
{ 
    return Task.Factory.StartNew<bool>(ConnectSync); 
} 

(Es posible que usted no tiene que especificar el argumento de tipo aquí - nunca puedo recordar las reglas exactas para la inferencia de tipos utilizando las conversiones de grupos de métodos.)

Sin embargo, eso aunará un hilo mientras se conecta. Si está de acuerdo con eso, al menos terminará con un método que puede llamar al desde un método asíncrono y aguarde adecuadamente. Si nada más, esto le permitirá construir el resto de su aplicación hacia arriba usando async, y luego si/cuando el código POP3 admite asincrónico, puede simplemente reescribir ConnectAsync para que sea un método asíncrono.

Cuestiones relacionadas