【发布时间】:2018-09-30 05:20:20
【问题描述】:
我仍然是 async/await 新手,但我认为我对它有了更好的把握。我正在写关于如何处理某种情况的建议。场景是,某个 Web 服务有一个方法同时具有同步和异步版本,但版本具有不同的返回类型。
getDocs() 返回document[],这就是我想要的。
getDocsAsync() 返回Task<getDocsResponse>,其中getDocsResponse 具有document[] 类型的(不可等待的)属性。
为了使事情更复杂,我在传递给另一个方法的委托中调用此方法。 (我这样做是为了可以随意从服务器获取新数据,或者使用我从之前的调用中缓存的保存数据。使用保存数据的委托基本上是Task.FromResult(myDocArray)。无论是新鲜的还是缓存的,我有更多代码将处理document 对象。)
主要问题是,如果我调用异步版本,我可以等待返回值的属性吗?如果是这样,怎么做?如果没有,我是否必须等待结果才能获取属性(如response.Result)?
(简化)代码示例:调用同步方法,但包装在一个任务中。这似乎可以正常工作,如果没有 getDocs 方法的异步版本,我会这样做。
Func<Task<document[]>> f = async () => {
var docs = Task.Run(() => service.GetDocs());
return await docs;
}
(简化)代码示例:调用异步版本,然后...?
Func<Task<document[]>> f = async () => {
var docs = service.GetDocsAsync();
// this seems silly to call .Result, only to wrap it in an awaitable task.
return await Task.FromResult(docs.Result.documents);
}
两个版本似乎都可以正常工作,但在这种情况下,异步路由似乎很尴尬。有没有更好的方法来处理这种情况?
谢谢!
【问题讨论】:
标签: c# async-await