编辑(接受后)
这可能不会立即显而易见,但@Servy 的答案是正确的,不需要Unwrap
在 monodroid 下的自定义实现 - 在我的评论中我说它不存在,但它确实存在。
结束编辑
我正在编写一堆使用我们的 RESTful Web 服务的应用程序,尽管我认为我知道如何正确使用任务,但事实证明我不知道。场景是我为 Windows Store 实现了代码 - 使用async/await
并且我需要为 MonoDroid 实现几乎相同的东西 - 它没有(没有一些我不想使用的构建黑客)。
我已经将这个问题的问题归结为一组简单的任务,用于异步获取整数,然后,在继续中,触发另一个异步任务,该任务将转换从该整数构建的字符串。在 C#5 中,这将是:
注意 - 当然我在Task.FromResult<T>
这里使用的是实际的异步代码
private async Task<string> GetStringAsync()
{
return await GetStringFromIntAsync(await GetIntAsync());
}
private async Task<int> GetIntAsync()
{
return await Task.FromResult(10);
}
private async Task<string> GetStringFromIntAsync(int value)
{
return await Task.FromResult(value.ToString());
}
要将其转换为基于延续的模式,我尝试了以下操作:
private Task<string> GetStringAsync()
{
//error on this line
return GetIntAsync().ContinueWith(t => GetStringFromIntAsync(t.Result));
}
private Task<int> GetIntAsync()
{
return Task.FromResult(10);
}
private Task<string> GetStringFromIntAsync(int value)
{
return Task.FromResult(value.ToString());
}
但是,这是不正确的,因为该GetStringFromIntAsync
方法返回的Task<string>
意思是延续最终返回 aTask<Task<string>>
而不是 a Task<string>
。
我发现明确等待该GetStringFromIntAsync
方法确实有效,但是:
private Task<string> GetStringAsync()
{
return GetIntAsync().ContinueWith(t =>
{
var nested = GetStringFromIntAsync(t.Result);
nested.Wait();
return nested.Result;
});
}
但是,问题是-这是正确的方法-我不能返回调用者然后等待的某种延续吗?
我已经使用了很多任务 - 但不是像这样将不同类型的任务链接在一起(当然除了async
/之外await
) - 感觉有点像我在这里发疯 - 所以非常感谢任何帮助。