10

私はWindows 8 Runtime Componentを開発しているので、パブリックインターフェイスにはWindowsランタイムタイプではないTask<T>が含まれていないようにすることができます。待ち受けができないときの待ち合わせ方法

これは、メソッドをasyncとマークすることはできず、awaitprivate 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; 
    }); 
}); 

これに伴う問題は、それがUIスレッドから呼び出されていない場合WebAuthenticationBrokerが作業を思われないということです。有用なエラーメッセージなしで有用なNotImplementedExceptionをスローします。

TryGetAuthResultFromFileに電話をかけてから、結果を待つには、GetAuthResultFromWebAuthenticationBrokerに電話してください。

答えて

15

インターフェイスにはTask/Task<T>を使用できませんが、IAsyncAction/IAsyncOperation<T>を使用できます。あなたが適切にAsAsyncAction/AsAsyncOperation/AsyncInfo.Runを呼び出すラッパーを持っている場合

あなたの実装では、Task/Task<T>を使用することができます。

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