[英]C# async/sync versions of Web Call return different types
我仍然是异步/等待新手,但我认为我对此有所了解。 我正在撰写有关如何处理特定情况的建议。 场景是,某个Web服务同时具有同步和异步版本的方法,但是这些版本具有不同的返回类型。
getDocs()
返回document[]
,这是我想要的。
getDocsAsync()
返回Task<getDocsResponse>
,其中getDocsResponse
具有类型为document[]
的(不可等待)属性。
为了进一步使事情复杂化,我在传递给另一个方法的委托中调用此方法。 (我这样做是为了随意从服务器获取新数据,或使用从较早的调用中缓存的已保存数据。使用已保存数据的委托基本上是Task.FromResult(myDocArray)
。或缓存,我有更多代码将用于处理document
对象。)
主要问题是,如果我调用异步版本,是否可以等待返回值的属性? 如果是这样,怎么办? 如果不是,我是否必须等待结果获取属性(例如, response.Result
)?
(简体)代码示例:调用sync方法,但包装一个任务。 这似乎可以正常工作,并且如果没有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);
}
两种版本都可以正常工作,但是在这种情况下,异步路由似乎很尴尬。 有没有更好的方法来处理这种情况?
谢谢!
不要在未await
任务上使用.Result
,因为在大多数情况下,它会导致死锁( await与Task.Wait-Deadlock? , await有效,但调用task.Result挂起/死锁 )
我认为您只想从异步委托中返回documents
:
Func<Task<document[]>> f = async () => {
Task<getDocsResponse> task = service.GetDocsAsync();
getDocsResponse response = await task;
return response.documents;
}
请注意,异步方法的结果始终是您return
的任何类型的Task<>
。 您不需要将结果包装在Task.FromResult
。
当您需要匹配Task<T>
签名但只有同步方法时, FromResult
很有用。 因此,您可能需要同步重写同步调用(除非您确实需要异步代码,但是通常不建议这样做- 将同步代码包装为异步方法的最佳方法是什么 )
Func<Task<document[]>> f = () => Task.FromResult(service.GetDocs());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.