当你无法等待时,你怎么能等待任务

时间:2012-11-28 16:36:56

标签: c# windows-8 windows-runtime task-parallel-library async-await

我正在开发一个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

1 个答案:

答案 0 :(得分: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();
  }
}