2012-09-13 12 views
22

In un'applicazione Windows 8 in C#/XAML, a volte voglio chiamare un metodo attendibile da un metodo non asincrono.È possibile chiamare un metodo attendibile in un metodo non asincrono?

In realtà è corretto sostituire questo:

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

da questo:

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

Il vantaggio per me è che posso usare MyCallingMethod senza attendere ma è corretto? Questo può essere un vantaggio se voglio passare un parametro ref per MyCallingMethod dato che non è possibile avere parametri ref in un metodo asincrono.

+0

non funzionerà. la tua funzione anonima asincrona non restituirà il valore alla funzione esterna. – Denis

risposta

15

Davvero non dovresti provare a fare qualcosa di simile se sei nel thread dell'interfaccia utente, perché ciò significa che dovrai bloccare il thread. Dovresti invece aggirare il parametro ref, ad esempio accettando un parametro di un tipo di classe semplice, che contenga il valore che desideri modificare.

Un altro motivo per non farlo è che non consente di utilizzare i parametri ref, perché lambdas non può accedere ai parametri ref del metodo di inclusione.

Ma se si vuole davvero fare questo (ancora una volta, penso davvero che non si dovrebbe), quindi sarà necessario ottenere il risultato dello Task. Qualcosa di simile:

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

Operazione facile, risolta automaticamente e restituire il risultato. Grazie – DRapp

40

Nel metodo non asincrono è possibile iniziare l'attività in modo asincrono e non attendere il risultato:

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

o è possibile collegare gestore di eventi ContinueWith, che viene chiamato dopo aver terminato la Task,

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

o si può ottenere il risultato della Task sincrono:

public string MyCallingMethod() 
{ 
    string result = myMethodAsync().Result; 
    return result; 
} 
Problemi correlati