При работе с API данных, использующих async rest calls (я использую RestSharp.Portable), каков наилучший способ обработки возвращаемых значений? Поскольку функция async может возвращать только задачу или задачу ... но у вызывающего нет возможности вернуться к возвращаемому значению ... как API вернет данные обратно вызывающему абоненту? Глобальные свойства?Как обрабатывать возвращаемые значения в async-функции
Из того, что я прочитал до сих пор, кажется, что функции обратного вызова являются единственным способом взаимодействия с данными ответа?
Возьмем, например, следующий метод; раньше я не использовал библиотеку асинхронной 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 но у вызывающего абонента все еще нет возможности добраться до данных ответа или я пропущу что-то очевидное? Может ли абонент подписаться на событие, которое запускается в Task.Completed и т. Д.?
Я очень нечеткий по этой концепции асинхронный. Есть ли примеры написания переносимых API данных?
Я не понимаю проблему. Вы задаете результат задачи. Эти данные будут возвращены вызывающему, когда задача будет завершена. –
Не совсем, потому что метод выходит сразу после отправки client.ExecuteAsync. В то время как tcs.Task не обеспечивает прямой способ взаимодействия со значением. Когда я добавляю ключевое слово 'wait' (чтобы завершить выполнение метода до выхода), я начал получать ошибки компилятора, которые были специфичны для RestSharp.Portable exe и на самом деле не имели для меня никакого смысла. Я рассмотрю статью, предложенную @sstan, и посмотрим, будут ли ошибки иметь смысл или нет. Вероятно, у меня есть что-то очевидное в моей реализации. Спасибо, что ответили! – Robert