异步返回多个参数

时间:2019-02-05 01:40:38

标签: c# async-await

我使用以下代码作为其余客户端的一部分。该代码按预期工作。现在,我想扩展到代码以返回HttpRespnseMessage及其结果。上下文是在错误调用功能的情况下,它将评估响应消息中的状态码和错误(如果有)。如何返回状态代码以及诸如<TResult, HttpResponseMessage>之类的结果。

public async Task<TResult> MakeApiCall<TResult>(string url, HttpMethod method, bool auth, string data = null) where TResult : class
{
    using (var httpClient = new HttpClient())
    {
        httpClient.Timeout = new TimeSpan(0, 0, 10);

        using (var request = new HttpRequestMessage { RequestUri = new Uri(url), Method = method })
        {
            request.Headers.Accept.Clear();
            request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            // add content
            if (method != HttpMethod.Get)
            {
                request.Content = new StringContent(data, Encoding.UTF8, "application/json");
            }

            if (auth)
            {
                request.Headers.Add("X-Service-Token", _authUser.ServiceApiKey);
            }

            HttpResponseMessage response = new HttpResponseMessage();
            try
            {
                response = await httpClient.SendAsync(request).ConfigureAwait(false);
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.ToString());
                if (response != null)
                {
                    Debug.WriteLine(response.StatusCode.ToString());
                }
                return null;
            }

            var stringSerialized = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
            // Debug.WriteLine(stringSerialized);

            // deserialize content
            try
            {
                var desrialized_data = JsonConvert.DeserializeObject<TResult>(stringSerialized, Converter.Settings);
                return desrialized_data;
            }
            catch (JsonReaderException ex)
            {
                Debug.WriteLine("JsonReaderException");
                Debug.WriteLine(ex.ToString());
                return null;
            }
            catch (JsonSerializationException ex)
            {
                Debug.WriteLine("JsonSerializationException");
                Debug.WriteLine(ex.ToString());
                return null;
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.ToString());
                return null;
            }
        }
    }
}

Edit2:正如Alexei Levenkov指出的,我的问题似乎几乎是重复的。我仍然接受Michael的回答,因为它显示了如何在异步任务的上下文中返回多个值

1 个答案:

答案 0 :(得分:3)

只需将 from django.shortcuts import render, redirect, get_object_or_404 from products.models import Product from .models import Cart def cart_home(request): cart_obj, new_obj = Cart.objects.new_or_get(request) products = cart_obj.products.all() return render(request, 'carts/home.html', {}) def cart_update(request): product_id = 1 #request.POST.get('product_id') # print(Product.objects.get(id=1)) if product_id is not None: try: product_obj = Product.objects.get(id=product_id) except Product.DoesNotExist: print("show message to user ,Product is gone") return redirect("cart:home") cart_obj, new_obj = Cart.objects.new_or_get(request) if product_id in cart_obj.products.all(): cart_obj.products.remove(product_obj) else: cart_obj.products.add(product_obj) # return redirect(product_obj.get_absolute_url()) return redirect("cart:home") 用于所需的类型

Tuple

C# tuple types

更新

Enigmativity正确地说

  

public async Task<(TResult,string)> MakeApiCall<TResult>(...) { ... return (response,somethingElse); // or return null; HttpResponseMessage,因此不应将其返回到外部   方法的