对外部web服务方法的异步调用没有返回预期的结果

本文关键字:返回 结果 调用 web 服务 方法 异步 对外部 | 更新日期: 2023-09-27 18:03:35

**注意我已经问过这个问题,它被标记为重复,但重复的问题并没有帮助解决我下面遇到的问题。

c#中异步编程的新手,我在获得以下工作方面有一些困难。

我正在使用一个外部WebService来获取CarInfo -他们已经提供了Async方法,在下面的例子中为传入的Cars对象的数量返回一个字符串。我在接口中对这个WebService进行了自己的抽象,如下所示:

Task<string> GetTicketIdAsync(Cars[] cars);

我的接口方法实现如下:

public async Task<string> GetTicketIdAsync(Ccars[] cars)
{
    try
    {
        if (_externalServiceClient == null)
        {
            _externalServiceClient = new ExternalServiceClient("WSHttpBinding_IExternalService");
        }
        string ticketID =
            await _externalServiceClient .GetCarInfosAsync(cars)
        return ticketID;
    }
    catch (Exception ex)
    {
        //TODO log 4 net 
        throw new Exception("Failed" + ex.Message);
    }
    finally
    {
        //WCF - Dispose and close client and then set to null
        CloseClient(_externalServiceClient );
        _externalServiceClient = null;
    }

在另一个类中,然后我有一个方法如下所示,添加一些汽车到DB,然后在同一个类中调用私有方法从webservice获得票。

public void AddCars(List<Cars> cars)
    {
        var ticketId = UpdateCarWithTicketId(cars);
        string test = "Hello-World";
    }

我的UpdateCars与TicketId方法如下:

private async Task<string> UpdateCarWithTicketId(List<Cars> cars)
{
    //Call my abstraction of external web service method
    string ticketId = await _myService.GetTicketIdAsync(cars);
    foreach (var car in cars)
    {
        cars.TicketId = ticketId;
    }
    //Update DB
    _carRepository.Update(cars);
    return ticketId;
}

一些事情-如果我在foreach循环var car中设置一个断点,它似乎永远不会被击中,所以DB不会更新。然后,如果我在字符串test = "hello world"行上的AddCars方法上设置一个断点- ticketId的值显示状态WaitingForActivation,当我期望从调用外部web服务返回一个唯一的字符串时。

我尝试将ConfigureAwait(false)添加到使用await的两个调用中,但仍然得到相同的结果。在配置异步方法正确运行时是否缺少某些东西?

编辑-

当前,当用户点击屏幕上的按钮时,这正在从MVC控制器调用-

    [AcceptVerbs(HttpVerbs.Post)]
    public async Task<ActionResult>Upload(CarImport viewModel)
    {
         //list of cars uploaded by user in Excel sheet - code to extract that removed
            await _CarInfoService.AddCars(cars);
        }
        return RedirectToAction("Home");
    }

然而,我得到一个错误的构建说不能等待无效- AddCars方法签名在我的_CarInfoService是无效的-应该改变为其他东西吗?

对外部web服务方法的异步调用没有返回预期的结果

UpdateCarWithTicketId返回的是Task<string>而不是string。您可以通过以下操作从中获得string:

public async void AddCars(List<Cars> cars)
{
    var ticketId = await UpdateCarWithTicketId(cars);
    string test = "Hello-World";
}