10

Task<T>Windows 8 ランタイム コンポーネントを開発しているため、Windowsランタイム タイプではないため、パブリック インターフェイスに含めることができません。

これは、メソッドにマークを付けたり、ライブラリ内のメソッドにマークを付けたり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;
    });
});

これに関する問題はWebAuthenticationBroker、UI スレッドから呼び出されていない場合、 が機能していないように見えることです。NotImplementedException有用なエラーメッセージなしで有用なものをスローします。

TryGetAuthResultFromFile呼び出して結果を待ってから呼び出すにはどうすればよいGetAuthResultFromWebAuthenticationBrokerですか?

4

1 に答える 1

15

Taskインターフェースは/を使用できませんが、 /Task<T>は使用できます。IAsyncActionIAsyncOperation<T>

実装では、必要に応じて//を呼び出すラッパーがある場合はTask/を使用できます。Task<T>AsAsyncActionAsAsyncOperationAsyncInfo.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();
  }
}
于 2012-11-28T17:07:58.360 に答える