当你无法等待时,如何等待任务?

11

我正在开发一个Windows 8运行时组件,因此公共接口不能包含Task<T>,因为它不是Windows运行时类型。

这意味着我不能将方法标记为async,并且不能在我的库中使用private async方法进行await。这导致了一些关于如何处理应用程序逻辑的混淆。

以下是我同步实现所需的方式。

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个回答

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();
  }
}

谢谢,我已经在其他地方使用过这种技术,它正好满足我的需求。我不确定为什么我没有发现显而易见的解决方案,可能是因为我想回家了。 - BenCr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接