10

我正在开发一个 Windows 8 运行时组件,因此公共接口不能包含Task<T>,因为它不是 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>,但可以使用IAsyncAction/ IAsyncOperation<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 回答