![](/img/trans.png)
[英]Why use async and return await, when you can return Task<T> directly?
[英]How can you await a Task when you can't 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;
});
});
这样做的问题是,如果没有从UI线程调用WebAuthenticationBroker
它似乎不起作用。 它抛出一个有用的NotImplementedException
而没有有用的错误消息。
如何调用TryGetAuthResultFromFile
然后等待结果,然后调用GetAuthResultFromWebAuthenticationBroker
?
您的界面不能使用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();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.