10

我正在開發Windows 8運行時組件,因此公共接口不能包含Task<T>,因爲它不是Windows運行時類型。當你無法等待時,你如何等待任務

這意味着我不能在方法庫中將方法標記爲async,也不能將await方法標記爲private async。這導致了一些關於如何處理我的應用程序邏輯的混淆。

這就是我如何做我想要同步。

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

r = GetAuthResultFromWebAuthenticationBroker(); 
return r; 

的問題是,TryGetResultFrom文件是async Task<Result>方法,而這回的R方法返回IAsyncOperation<Result>

我已經試過這(這是不完整的代碼,但該理論可以看出,處理導致繼續並返回它們,我不得不對一些類型的IAsyncOperation類型做結果)。

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

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

這樣做的問題是,WebAuthenticationBroker似乎工作不一樣,如果它沒有被從UI線程調用。它會引發一個有幫助的NotImplementedException而沒有有用的錯誤消息。

如何才能撥打TryGetAuthResultFromFile然後等待結果,然後致電GetAuthResultFromWebAuthenticationBroker

回答

15

您的接口不能使用Task/Task<T>,但它可以使用IAsyncAction/IAsyncOperation<T>

您的實現可以使用Task/Task<T>,如果你有一個調用AsAsyncAction/AsAsyncOperation/AsyncInfo.Run適當的包裝。

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

謝謝,我已經在其他地方使用了這種技術,它完全符合我的需求。我不知道爲什麼我沒有發現明顯的解決方案,我認爲是在家。 – BenCr