2012-09-13 9 views
22

En una aplicación de Windows 8 en C#/XAML, a veces quiero llamar a un método que se pueda esperar de un método no asincrónico.¿Es posible llamar a un método de espera en un método no asíncrono?

En realidad ¿es correcto sustituir este:

public async Task<string> MyCallingMethod() 
    { 
     string result = await myMethodAsync(); 
     return result; 
    } 

por esto:

public string MyCallingMethod() 
    { 
     Task.Run(async() => { 
      string result = await myMethodAsync(); 
      return result; 
      }); 
    } 

La ventaja para mí es que puedo usar MyCallingMethod sin esperar, pero ¿es esto correcto? Esto puede ser una ventaja si quiero pasar un parámetro ref para MyCallingMethod ya que no es posible tener parámetros ref en un método asíncrono.

+0

no va a funcionar. su función asíncrona anónima no devolverá valor a la función externa. – Denis

Respuesta

15

Realmente no deberías tratar de hacer algo así si estás en el hilo de UI, porque eso significará que bloquearás el hilo. En su lugar, debe trabajar alrededor del parámetro ref, por ejemplo, aceptando un parámetro de un tipo de clase simple, que contiene el valor que desea cambiar.

Otra razón por la que no hacer esto es que todavía no le permitirá usar los parámetros ref, porque lambdas no puede acceder a los parámetros ref del método adjunto.

Pero si realmente quieres hacer esto (de nuevo, realmente creo que no deberías), entonces necesitarás obtener el resultado del Task. Algo así como:

public string MyCallingMethod() 
{ 
    var task = Task.Run(async() => 
    { 
     return await myMethodAsync(); 
    }); 
    return task.Result; 
} 
+0

Tarea agradable, auto resuelta y devuelve el resultado. Gracias – DRapp

40

En método no asíncrono usted puede iniciar la tarea de forma asíncrona y no esperar el resultado:

public void MyCallingMethod() 
{ 
    Task t = myMethodAsync(); 
} 

o puede adjuntar controlador de eventos ContinueWith, que se llama después de terminar el tarea,

public void MyCallingMethod() 
{ 
    myMethodAsync().ContinueWith(
     result => 
     { 
      // do stuff with the result 
     }); 
} 

o puede obtener el resultado de la tarea de forma sincrónica:

public string MyCallingMethod() 
{ 
    string result = myMethodAsync().Result; 
    return result; 
} 
Cuestiones relacionadas