10

Sto sviluppando un componente di Runtime di Windows 8 in modo che l'interfaccia pubblica non possa contenere Task<T> in quanto non è un tipo di runtime di Windows.Come è possibile attendere un'attività quando non è possibile attendere

Ciò significa che non è possibile contrassegnare il metodo come async e non è possibile utilizzare i metodi private async nella libreria. Ciò sta portando ad una certa confusione su come gestire la mia logica applicativa.

Ecco come farei ciò che voglio in modo sincrono.

Result r = TryGetAuthResultFromFile(); 
if(r != null) 
{ 
    return r; 
} 

r = GetAuthResultFromWebAuthenticationBroker(); 
return r; 

Il problema è che il file TryGetResultFrom sono async Task<Result> metodi e il metodo che sta tornando r sta tornando IAsyncOperation<Result>

Ho provato questo (non si tratta di codice completo, ma la teoria può essere visto, di gestire il risultati in continuazioni e restituirli, dovrei fare un po 'di risultati sui tipi IAsyncOperation).

TryGetAuthResultFromFile().ContinueWith(x=> 
{ 
    if(x.Result != null) 
    { 
     return x.result; 
    } 

    GetAuthResultFromWebAuthenticationBroker().ContinueWith(y=> 
    { 
     return y.Result; 
    }); 
}); 

Il problema di questo è che il WebAuthenticationBroker non sembra il lavoro, se non è stato chiamato dal thread dell'interfaccia utente. Invia un utile NotImplementedException senza un utile messaggio di errore.

Come posso chiamare TryGetAuthResultFromFile quindi attendere il risultato, quindi chiamare GetAuthResultFromWebAuthenticationBroker?

risposta

15

L'interfaccia non può utilizzare Task/Task<T>, ma può utilizzare IAsyncAction/IAsyncOperation<T>.

L'implementazione può utilizzare Task/Task<T> se si dispone di un wrapper che chiama AsAsyncAction/AsAsyncOperation/AsyncInfo.Run a seconda dei casi.

public interface IMyInterface 
{ 
    IAsyncOperation<MyResult> MyMethod(); 
} 

public sealed class MyClass: IMyInterface 
{ 
    private async Task<MyResult> MyMethodAsync() 
    { 
    var r = await TryGetAuthResultFromFileAsync(); 
    if (r != null) 
     return r; 
    return await GetAuthResultFromAuthenticationBrokerAsync(); 
    } 

    public IAsyncOperation<MyResult> MyMethod() 
    { 
    return MyMethodAsync().AsAsyncOperation(); 
    } 
} 
+0

Grazie, ho già usato questa tecnica da qualche altra parte e fa esattamente quello che mi serve. Non sono sicuro del motivo per cui non ho individuato l'ovvia soluzione, a mio avviso. – BenCr