【问题标题】:How can you await a Task when you can't await当您无法等待时,您如何等待任务
【发布时间】:2012-11-28 16:36:56
【问题描述】:

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

问题在于,如果不是从 UI 线程调用,WebAuthenticationBroker 似乎不起作用。它会抛出一个有用的NotImplementedException,但没有有用的错误消息。

如何调用TryGetAuthResultFromFile然后等待结果,然后再调用GetAuthResultFromWebAuthenticationBroker

【问题讨论】:

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


    【解决方案1】:

    你的界面不能使用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();
      }
    }
    

    【讨论】:

    • 谢谢,我已经在其他地方使用过这种技术,它正是我需要的。我不知道为什么我没有发现明显的解决方案,我想是在家的时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多