10

Pracuję nad komponentem wykonawczym systemu Windows 8, aby interfejs publiczny nie mógł zawierać Task<T>, ponieważ nie jest typem środowiska uruchomieniowego systemu Windows.Jak można oczekiwać zadania, gdy nie można czekać na

Oznacza to, że nie mogę oznaczyć metody jako async i nie mogę await metod private async w mojej bibliotece. Prowadzi to do pewnego zamieszania związanego z obsługą mojej logiki aplikacji.

W ten sposób zrobię to, co chcę synchronicznie.

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

r = GetAuthResultFromWebAuthenticationBroker(); 
return r; 

Problemem jest to, że plik TryGetResultFrom są async Task<Result> sposoby i metody, która jest powrocie r wraca IAsyncOperation<Result>

próbowałem to (nie jest to kompletny kod ale teoria widać obsłużyć skutkuje kontynuacją i zwróci je, musiałbym zrobić kilka frigging wyników do typów IAsyncOperation).

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

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

Problem z tym jest to, że nie wydaje WebAuthenticationBroker pracę, jeśli to nie jest wywoływana z wątku UI. Rzuca pomocny NotImplementedException bez użytecznego komunikatu o błędzie.

Jak mogę zadzwonić pod numer TryGetAuthResultFromFile, a następnie poczekać na wynik, a następnie zadzwonić pod numer GetAuthResultFromWebAuthenticationBroker?

Odpowiedz

15

Twój interfejs nie może używać Task/Task<T>, ale może używać IAsyncAction/IAsyncOperation<T>.

Implementacja może używać Task/Task<T> jeśli masz otoki, który wywołuje AsAsyncAction/AsAsyncOperation/AsyncInfo.Run jako właściwe.

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

Dzięki, już używałem tej techniki gdzie indziej i robi dokładnie to, czego potrzebuję. Nie jestem pewien, dlaczego nie zauważyłem oczywistego rozwiązania, myślę, że czas w domu. – BenCr

Powiązane problemy