【发布时间】:2015-07-19 00:05:31
【问题描述】:
在处理使用异步休息调用的数据 API 时(我使用的是 RestSharp.Portable),处理返回值的最佳方法是什么?由于异步函数只能返回一个任务或任务......但调用者无法返回返回值......API如何将数据返回给调用者?全局属性?
从我目前阅读的内容来看,回调函数似乎是与响应数据交互的唯一方法?
以下面的方法为例;以前我没有使用异步 Rest 库并且能够返回一个值,但是在将其转换为使用 RestSharp.Portable 后,我没有看到返回值的方法:
public async Task<EntityResourceDescriptor> GetEntityDescriptor(string entityType)
{
TaskCompletionSource<EntityResourceDescriptor> tcs = new TaskCompletionSource<EntityResourceDescriptor>();
var req = new RestRequest("/qcbin/rest/domains/{domain}/projects/{project}/customization/entities/{entityType}");
AddDomainAndProject(req);
req.AddParameter("entityType", entityType, ParameterType.UrlSegment);
client.ExecuteAsync<EntityResourceDescriptor>(req, (res) =>
{
if (res.ResponseStatus == ResponseStatus.Error)
{
tcs.TrySetException(res.ErrorException);
}
else
{
tcs.SetResult(res.Data);
}
}
);
return tcs.Task;
}
在这里我能做的就是返回任务,但调用者仍然无法获取响应数据,还是我遗漏了一些明显的东西?调用者可以订阅在 Task.Completed 等处触发的事件吗?
我对这个异步概念非常模糊。是否有编写可移植数据 API 的示例?
【问题讨论】:
-
我不明白这个问题。您正在设置任务的结果。任务完成后,该数据将返回给调用者。
-
并非如此,因为该方法在发送 client.ExecuteAsync 后立即退出。而 tcs.Task 不提供与值交互的直接方式。当我添加 'await' 关键字(强制方法执行在退出之前完成)时,我开始收到特定于 RestSharp.Portable exe 的编译器错误,对我来说并没有多大意义。我将阅读@sstan 建议的文章,看看这些错误是否有意义。我可能在我的实现中遗漏了一些明显的东西。感谢您的回复!
标签: c# asynchronous restsharp