Web Call的C#异步/同步版本返回不同的类型

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web Call的C#异步/同步版本返回不同的类型相关的知识,希望对你有一定的参考价值。

我仍然是一个异步/等待新手,但我认为我对它有了更好的把握。我正在写关于如何处理某个场景的建议。方案是,某个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);
}

两个版本似乎都运行正常,但在这种情况下,异步路由似乎很尴尬。有没有更好的方法来处理这种情况?

谢谢!

以上是关于Web Call的C#异步/同步版本返回不同的类型的主要内容,如果未能解决你的问题,请参考以下文章

创建异步 Web 服务方法

OKHttp源码解析

反向代理服务的区别

同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式

阻塞非阻塞同步异步

HTTP请求中同步与异步有啥不同