Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中从sync调用异步方法?_C#_Asynchronous_Asp.net Web Api - Fatal编程技术网

如何在C#中从sync调用异步方法?

如何在C#中从sync调用异步方法?,c#,asynchronous,asp.net-web-api,C#,Asynchronous,Asp.net Web Api,我正在向现有功能添加一个新的web API调用。我想使此API调用异步,但它似乎导致了死锁。如果我想使整个代码通道async,这是不可能的,那么我必须做更多的更改 我的问题是: // Exisitng Method public Tuple<RestaurantDeliveryProvider, DeliveryHubResult, Task<DeliveryManagerQuoteResponse>> CreateDeliveryRequest(OrderContext

我正在向现有功能添加一个新的web API调用。我想使此API调用
异步
,但它似乎导致了死锁。如果我想使整个代码通道
async
,这是不可能的,那么我必须做更多的更改

我的问题是:

// Exisitng Method
public Tuple<RestaurantDeliveryProvider, DeliveryHubResult, Task<DeliveryManagerQuoteResponse>> CreateDeliveryRequest(OrderContextDTO orderContextDto)
{
    var provider = RestaurantBl.GetDeliveryProviderInformationByRestaurantId(orderContextDto.RestaurantId ?? 0);

    var deliveryHubResult = RestaurantBl.GetDeliveryHubResult(orderContextDto.OrderId ?? 0);;

    // New Call which always comes back with "Not Yet Computed" result
    Task<DeliveryManagerQuoteResponse> deliveryManagerQuoteResponse = _deliveryManager.CreateQuoteRequestAsync(orderContextDto, orderInfo);

    return Tuple.Create(provider, deliveryHubResult, deliveryManagerQuoteResponse);
}
public async Task<DeliveryManagerQuoteResponse> CreateQuoteRequestAsync(OrderContextDTO orderContextDto, OrderInfoDTO orderInfo)
{
    DeliveryManagerQuoteResponse deliveryManagerQuoteResponse = null;

    try
    {
        var restaurantInfo = RestaurantApi.GetRestaurant(orderInfo.RestaurantId);
        var quoteRequest = new DeliveryManagerQuoteRequest
        {
            DeliveryProvider = null, 
            Country = orderContextDto.DeliveryEstimateRequestDto.RequestedDeliveryAddress.Country,
            Concept = "BK", 
            StoreName = "BK-TEST-US-4", 
            OrderId = orderInfo.OrderId.ToString(),
            AllowCash = false, 
            PaymentType = OrderPaymentType.Prepaid_Credit,
            Note = orderInfo.DeliveryInstructions,
        };

        deliveryManagerQuoteResponse = await Quote(quoteRequest);
    }
    catch (Exception ex)
    {
        Log.ErrorFormat("Get Delivery Manager Quote failed: Error: {0}, OrderId: {1}", ex.Message, orderContextDto.OrderId);
    }

    return deliveryManagerQuoteResponse;
}


public async Task<DeliveryManagerQuoteResponse> Quote(DeliveryManagerQuoteRequest quoteRequest)
{
    DeliveryManagerQuoteResponse deliveryManagerQuoteResponse;

    var client = HttpClientFactory.GetClient();
    var content = HttpClientFactory.JsonContentFactory.CreateJsonContent(quoteRequest);
    var response = await client.PostAsync("https://myUrl", content);

    if (response.IsSuccessStatusCode)
    {
        var data = await response.Content.ReadAsStringAsync();
        deliveryManagerQuoteResponse = JsonConvert.DeserializeObject<DeliveryManagerQuoteResponse>(data);
    }
    else
    {
        throw new Exception((int)response.StatusCode + "-" + response.StatusCode);
    }

    return deliveryManagerQuoteResponse;
}
public async Task<DeliveryManagerQuoteResponse> Quote(DeliveryManagerQuoteRequest quoteRequest)
{
    DeliveryManagerQuoteResponse deliveryManagerQuoteResponse;

    using (var client = new HttpClient())
    {
        var content = HttpClientFactory.JsonContentFactory.CreateJsonContent(quoteRequest);
        var response = await client.PostAsync("https://myUrl", content);

        if (response.IsSuccessStatusCode)
        {
            var data = await response.Content.ReadAsStringAsync();
            deliveryManagerQuoteResponse = JsonConvert.DeserializeObject<DeliveryManagerQuoteResponse>(data);
        }
        else
        {
            throw new Exception((int)response.StatusCode + "-" + response.StatusCode);
        }
    }

    return deliveryManagerQuoteResponse;
}
  • 可以从常规方法调用
    async
    方法吗

  • 我错过了什么?或者这里的正确方法是什么

  • 代码:

    // Exisitng Method
    public Tuple<RestaurantDeliveryProvider, DeliveryHubResult, Task<DeliveryManagerQuoteResponse>> CreateDeliveryRequest(OrderContextDTO orderContextDto)
    {
        var provider = RestaurantBl.GetDeliveryProviderInformationByRestaurantId(orderContextDto.RestaurantId ?? 0);
    
        var deliveryHubResult = RestaurantBl.GetDeliveryHubResult(orderContextDto.OrderId ?? 0);;
    
        // New Call which always comes back with "Not Yet Computed" result
        Task<DeliveryManagerQuoteResponse> deliveryManagerQuoteResponse = _deliveryManager.CreateQuoteRequestAsync(orderContextDto, orderInfo);
    
        return Tuple.Create(provider, deliveryHubResult, deliveryManagerQuoteResponse);
    }
    
    public async Task<DeliveryManagerQuoteResponse> CreateQuoteRequestAsync(OrderContextDTO orderContextDto, OrderInfoDTO orderInfo)
    {
        DeliveryManagerQuoteResponse deliveryManagerQuoteResponse = null;
    
        try
        {
            var restaurantInfo = RestaurantApi.GetRestaurant(orderInfo.RestaurantId);
            var quoteRequest = new DeliveryManagerQuoteRequest
            {
                DeliveryProvider = null, 
                Country = orderContextDto.DeliveryEstimateRequestDto.RequestedDeliveryAddress.Country,
                Concept = "BK", 
                StoreName = "BK-TEST-US-4", 
                OrderId = orderInfo.OrderId.ToString(),
                AllowCash = false, 
                PaymentType = OrderPaymentType.Prepaid_Credit,
                Note = orderInfo.DeliveryInstructions,
            };
    
            deliveryManagerQuoteResponse = await Quote(quoteRequest);
        }
        catch (Exception ex)
        {
            Log.ErrorFormat("Get Delivery Manager Quote failed: Error: {0}, OrderId: {1}", ex.Message, orderContextDto.OrderId);
        }
    
        return deliveryManagerQuoteResponse;
    }
    
    
    public async Task<DeliveryManagerQuoteResponse> Quote(DeliveryManagerQuoteRequest quoteRequest)
    {
        DeliveryManagerQuoteResponse deliveryManagerQuoteResponse;
    
        var client = HttpClientFactory.GetClient();
        var content = HttpClientFactory.JsonContentFactory.CreateJsonContent(quoteRequest);
        var response = await client.PostAsync("https://myUrl", content);
    
        if (response.IsSuccessStatusCode)
        {
            var data = await response.Content.ReadAsStringAsync();
            deliveryManagerQuoteResponse = JsonConvert.DeserializeObject<DeliveryManagerQuoteResponse>(data);
        }
        else
        {
            throw new Exception((int)response.StatusCode + "-" + response.StatusCode);
        }
    
        return deliveryManagerQuoteResponse;
    }
    
    public async Task<DeliveryManagerQuoteResponse> Quote(DeliveryManagerQuoteRequest quoteRequest)
    {
        DeliveryManagerQuoteResponse deliveryManagerQuoteResponse;
    
        using (var client = new HttpClient())
        {
            var content = HttpClientFactory.JsonContentFactory.CreateJsonContent(quoteRequest);
            var response = await client.PostAsync("https://myUrl", content);
    
            if (response.IsSuccessStatusCode)
            {
                var data = await response.Content.ReadAsStringAsync();
                deliveryManagerQuoteResponse = JsonConvert.DeserializeObject<DeliveryManagerQuoteResponse>(data);
            }
            else
            {
                throw new Exception((int)response.StatusCode + "-" + response.StatusCode);
            }
        }
    
        return deliveryManagerQuoteResponse;
    }
    
    //现有方法
    公共元组CreateDeliveryRequest(OrderContextDTO到OrderContextDTO)
    {
    var provider=RestaurantBl.GetDeliveryProviderInformationByRestaurantId(orderContextDto.RestaurantId??0);
    var deliveryHubResult=RestaurantBl.GetDeliveryHubResult(orderContextDto.OrderId??0);;
    //总是返回“尚未计算”结果的新调用
    任务deliveryManager报价响应=_deliveryManager.CreateQuoteRequestAsync(orderContextDto,orderInfo);
    返回Tuple.Create(提供程序、deliveryHubResult、deliveryManagerQuoteResponse);
    }
    
    异步方法:

    // Exisitng Method
    public Tuple<RestaurantDeliveryProvider, DeliveryHubResult, Task<DeliveryManagerQuoteResponse>> CreateDeliveryRequest(OrderContextDTO orderContextDto)
    {
        var provider = RestaurantBl.GetDeliveryProviderInformationByRestaurantId(orderContextDto.RestaurantId ?? 0);
    
        var deliveryHubResult = RestaurantBl.GetDeliveryHubResult(orderContextDto.OrderId ?? 0);;
    
        // New Call which always comes back with "Not Yet Computed" result
        Task<DeliveryManagerQuoteResponse> deliveryManagerQuoteResponse = _deliveryManager.CreateQuoteRequestAsync(orderContextDto, orderInfo);
    
        return Tuple.Create(provider, deliveryHubResult, deliveryManagerQuoteResponse);
    }
    
    public async Task<DeliveryManagerQuoteResponse> CreateQuoteRequestAsync(OrderContextDTO orderContextDto, OrderInfoDTO orderInfo)
    {
        DeliveryManagerQuoteResponse deliveryManagerQuoteResponse = null;
    
        try
        {
            var restaurantInfo = RestaurantApi.GetRestaurant(orderInfo.RestaurantId);
            var quoteRequest = new DeliveryManagerQuoteRequest
            {
                DeliveryProvider = null, 
                Country = orderContextDto.DeliveryEstimateRequestDto.RequestedDeliveryAddress.Country,
                Concept = "BK", 
                StoreName = "BK-TEST-US-4", 
                OrderId = orderInfo.OrderId.ToString(),
                AllowCash = false, 
                PaymentType = OrderPaymentType.Prepaid_Credit,
                Note = orderInfo.DeliveryInstructions,
            };
    
            deliveryManagerQuoteResponse = await Quote(quoteRequest);
        }
        catch (Exception ex)
        {
            Log.ErrorFormat("Get Delivery Manager Quote failed: Error: {0}, OrderId: {1}", ex.Message, orderContextDto.OrderId);
        }
    
        return deliveryManagerQuoteResponse;
    }
    
    
    public async Task<DeliveryManagerQuoteResponse> Quote(DeliveryManagerQuoteRequest quoteRequest)
    {
        DeliveryManagerQuoteResponse deliveryManagerQuoteResponse;
    
        var client = HttpClientFactory.GetClient();
        var content = HttpClientFactory.JsonContentFactory.CreateJsonContent(quoteRequest);
        var response = await client.PostAsync("https://myUrl", content);
    
        if (response.IsSuccessStatusCode)
        {
            var data = await response.Content.ReadAsStringAsync();
            deliveryManagerQuoteResponse = JsonConvert.DeserializeObject<DeliveryManagerQuoteResponse>(data);
        }
        else
        {
            throw new Exception((int)response.StatusCode + "-" + response.StatusCode);
        }
    
        return deliveryManagerQuoteResponse;
    }
    
    public async Task<DeliveryManagerQuoteResponse> Quote(DeliveryManagerQuoteRequest quoteRequest)
    {
        DeliveryManagerQuoteResponse deliveryManagerQuoteResponse;
    
        using (var client = new HttpClient())
        {
            var content = HttpClientFactory.JsonContentFactory.CreateJsonContent(quoteRequest);
            var response = await client.PostAsync("https://myUrl", content);
    
            if (response.IsSuccessStatusCode)
            {
                var data = await response.Content.ReadAsStringAsync();
                deliveryManagerQuoteResponse = JsonConvert.DeserializeObject<DeliveryManagerQuoteResponse>(data);
            }
            else
            {
                throw new Exception((int)response.StatusCode + "-" + response.StatusCode);
            }
        }
    
        return deliveryManagerQuoteResponse;
    }
    
    公共异步任务CreateQuoteRequestAsync(OrderContextDTO到OrderContextDTO,OrderInfoDTO到orderInfo)
    {
    DeliveryManagerQuoteResponse DeliveryManagerQuoteResponse=null;
    尝试
    {
    var restaurantInfo=RestaurantApi.GetRestaurant(orderInfo.RestaurantId);
    var quotereRequest=新的DeliveryManager quotereRequest
    {
    DeliveryProvider=null,
    Country=orderContextDto.DeliveryEstimateRequestDto.RequestedDeliveryAddress.Country,
    Concept=“BK”,
    StoreName=“BK-TEST-US-4”,
    OrderId=orderInfo.OrderId.ToString(),
    AllowCash=false,
    PaymentType=OrderPaymentType.预付费\信用卡,
    注意=orderInfo.DeliveryInstructions,
    };
    deliveryManagerQuoteResponse=等待报价(quoteRequest);
    }
    捕获(例外情况除外)
    {
    ErrorFormat(“获取传递管理器报价失败:错误:{0},OrderId:{1}”,例如Message,orderContextDto.OrderId);
    }
    返回DeliveryManager报价响应;
    }
    公共异步任务报价(DeliveryManagerQuoteRequest quoteRequest)
    {
    DeliveryManager报价响应DeliveryManager报价响应;
    var client=HttpClientFactory.GetClient();
    var content=HttpClientFactory.JsonContentFactory.CreateJsonContent(quoteRequest);
    var response=wait client.PostAsync(“https://myUrl“,内容);
    if(响应。IsSuccessStatusCode)
    {
    var data=await response.Content.ReadAsStringAsync();
    deliveryManagerQuoteResponse=JsonConvert.DeserializeObject(数据);
    }
    其他的
    {
    抛出新异常((int)response.StatusCode+“-”+response.StatusCode);
    }
    返回DeliveryManager报价响应;
    }
    
    我也尝试了以下内容,但结果相同:

    // Exisitng Method
    public Tuple<RestaurantDeliveryProvider, DeliveryHubResult, Task<DeliveryManagerQuoteResponse>> CreateDeliveryRequest(OrderContextDTO orderContextDto)
    {
        var provider = RestaurantBl.GetDeliveryProviderInformationByRestaurantId(orderContextDto.RestaurantId ?? 0);
    
        var deliveryHubResult = RestaurantBl.GetDeliveryHubResult(orderContextDto.OrderId ?? 0);;
    
        // New Call which always comes back with "Not Yet Computed" result
        Task<DeliveryManagerQuoteResponse> deliveryManagerQuoteResponse = _deliveryManager.CreateQuoteRequestAsync(orderContextDto, orderInfo);
    
        return Tuple.Create(provider, deliveryHubResult, deliveryManagerQuoteResponse);
    }
    
    public async Task<DeliveryManagerQuoteResponse> CreateQuoteRequestAsync(OrderContextDTO orderContextDto, OrderInfoDTO orderInfo)
    {
        DeliveryManagerQuoteResponse deliveryManagerQuoteResponse = null;
    
        try
        {
            var restaurantInfo = RestaurantApi.GetRestaurant(orderInfo.RestaurantId);
            var quoteRequest = new DeliveryManagerQuoteRequest
            {
                DeliveryProvider = null, 
                Country = orderContextDto.DeliveryEstimateRequestDto.RequestedDeliveryAddress.Country,
                Concept = "BK", 
                StoreName = "BK-TEST-US-4", 
                OrderId = orderInfo.OrderId.ToString(),
                AllowCash = false, 
                PaymentType = OrderPaymentType.Prepaid_Credit,
                Note = orderInfo.DeliveryInstructions,
            };
    
            deliveryManagerQuoteResponse = await Quote(quoteRequest);
        }
        catch (Exception ex)
        {
            Log.ErrorFormat("Get Delivery Manager Quote failed: Error: {0}, OrderId: {1}", ex.Message, orderContextDto.OrderId);
        }
    
        return deliveryManagerQuoteResponse;
    }
    
    
    public async Task<DeliveryManagerQuoteResponse> Quote(DeliveryManagerQuoteRequest quoteRequest)
    {
        DeliveryManagerQuoteResponse deliveryManagerQuoteResponse;
    
        var client = HttpClientFactory.GetClient();
        var content = HttpClientFactory.JsonContentFactory.CreateJsonContent(quoteRequest);
        var response = await client.PostAsync("https://myUrl", content);
    
        if (response.IsSuccessStatusCode)
        {
            var data = await response.Content.ReadAsStringAsync();
            deliveryManagerQuoteResponse = JsonConvert.DeserializeObject<DeliveryManagerQuoteResponse>(data);
        }
        else
        {
            throw new Exception((int)response.StatusCode + "-" + response.StatusCode);
        }
    
        return deliveryManagerQuoteResponse;
    }
    
    public async Task<DeliveryManagerQuoteResponse> Quote(DeliveryManagerQuoteRequest quoteRequest)
    {
        DeliveryManagerQuoteResponse deliveryManagerQuoteResponse;
    
        using (var client = new HttpClient())
        {
            var content = HttpClientFactory.JsonContentFactory.CreateJsonContent(quoteRequest);
            var response = await client.PostAsync("https://myUrl", content);
    
            if (response.IsSuccessStatusCode)
            {
                var data = await response.Content.ReadAsStringAsync();
                deliveryManagerQuoteResponse = JsonConvert.DeserializeObject<DeliveryManagerQuoteResponse>(data);
            }
            else
            {
                throw new Exception((int)response.StatusCode + "-" + response.StatusCode);
            }
        }
    
        return deliveryManagerQuoteResponse;
    }
    
    公共异步任务报价(DeliveryManagerQuoteRequest报价请求)
    {
    DeliveryManager报价响应DeliveryManager报价响应;
    使用(var client=new HttpClient())
    {
    var content=HttpClientFactory.JsonContentFactory.CreateJsonContent(quoteRequest);
    var response=wait client.PostAsync(“https://myUrl“,内容);
    if(响应。IsSuccessStatusCode)
    {
    var data=await response.Content.ReadAsStringAsync();
    deliveryManagerQuoteResponse=JsonConvert.DeserializeObject(数据);
    }
    其他的
    {
    抛出新异常((int)response.StatusCode+“-”+response.StatusCode);
    }
    }
    返回DeliveryManager报价响应;
    }
    
    输出(很抱歉输出模糊,如果单击它,您将看到清晰的结果):

  • 不要
  • 不要
  • 基本上,没有好的或可行的方法从同步方法调用异步方法并等待答案。有“异步同步”,但这是一种反模式,应该积极避免

    因此,要么:

  • 将调用者重写为
    async
  • 实现API的同步版本

  • 让我试试
    sync
    version。非常感谢。