簡體   English   中英

從異步任務返回C#無效

[英]C# return from async task not working

我正在使用HttpClient進行異步http調用。 該調用在異步任務內進行。 調用成功,並且從Http調用中得到響應。 但是,當我嘗試從任務返回響應時,即使返回后有一個斷點在等待,也沒有任何反應。

public void ExecuteTask(Foundation.Security.SecurityToken token, Order order)
{
    ExecuteTaskAsync(token, order).Wait();
}

public async Task ExecuteTaskAsync(Foundation.Security.SecurityToken token, Order order)
{
    if (order != null)
    {
        log.Info("Starting export of order " + order.ID.ToString());
        bool success = await ExportOrder(order, token);
        if (!success)
        {
            log.Error("Failed to export order with ID " + order.ID.ToString());
        }
    }
}

private async Task<bool> ExportOrder(Order order, Foundation.Security.SecurityToken token)
{
    try
    {
        ResponseObject response = await webService.SendOrder(new SenderInformation(token), new ReceiverInformation(order, token));
        if (response.Success && response.Status.Equals("201", StringComparison.OrdinalIgnoreCase))
        {
            log.Info(String.Format("Order ({0}) was successfully exported"), order.ExternalOrderID);
           return true;
    }
        return false;
    }
    catch (Exception e)
    {
        log.Error(String.Format("Exception occured while exporting order ({0})", order.ID), e);
        return false;
    }
}

以下是執行實際http調用的代碼。 我將最后一條功能行標記為“代碼成功到達此行。此后一切都沒有”

public Task<ResponseObject> SendOrder(SenderInformation sender, ReceiverInformation receiver)
{
    OrderRequest request = new OrderRequest(sender, receiver);
    return ExecuteRequest<OrderRequest, ResponseObject>(request);
}

private async Task<ResponseType> ExecuteRequest<RequestType, ResponseType>   (RequestType request)
where RequestType : RequestObject
where ResponseType : class, ResponseObject, new() 
{
    try
    {
        using (var client = new HttpClient())
        {
            string xml = SerializeRequest(request);
            HttpContent content = new StringContent(xml);
            content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("text/xml");
            string requestUrl = "URL";
            HttpResponseMessage response = await client.PostAsync(requestUrl, content).ConfigureAwait(false);

            // Parse response
            if (response.IsSuccessStatusCode)
            {
                Stream responseStream = await response.Content.ReadAsStreamAsync();
                ResponseType responseObject = DeserializeResponse<ResponseType>(responseStream);
                if (responseObject != null)
                {
                    responseObject.Success = true;
                    return responseObject;  //The code successfully reach this line. After this nothing happens
                }
                else
                {
                    log.Error("Response could not be deserialized");
                }
            }
            else
            {
                log.Error("Error during request, got status code " +  response.StatusCode);
            }
        }
    }
    catch (Exception e)
    {
        log.Error("Something went wrong!", e);
    }
    return new ResponseType() { Success = false };
}

問題在這條線上:

ExecuteTaskAsync(token, order).Wait();

這將導致死鎖:由於UI線程被阻塞,因此被調用方法中的await無法恢復。

使用異步代碼時,必須始終使用它。 永遠不要同步等待異步任務完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM