异步调用外部Web服务方法不返回预期结果

时间:2014-05-14 17:09:05

标签: c# .net asynchronous .net-4.5

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

使用C#进行异步编程的新手,我在使用以下工作时遇到了一些困难。

我正在使用外部WebService获取CarInfo - 他们提供了Async方法,在下面的示例中返回传入的Number of 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";
    }

我使用TicketId方法的UpdateCars如下:

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循环变量汽车上设置一个断点,它似乎永远不会受到打击,因此数据库不会更新。然后,如果我在字符串test =&#34; hello world&#34;上设置我的AddCars方法的断点。 line - 当我期待从我对外部Web服务的调用返回的唯一字符串时,ticketId的值显示WaitingForActivation状态。

我尝试将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");
    }

但是我在Build上遇到错误,说无法等待无效 - 我的_CarInfoService上的AddCars方法签名是无效的 - 是否应该更改为其他内容?

1 个答案:

答案 0 :(得分:0)

UpdateCarWithTicketId会返回Task<string>而不是string。你可以通过做这样的事情来获得string

public async void AddCars(List<Cars> cars)
{
    var ticketId = await UpdateCarWithTicketId(cars);

    string test = "Hello-World";
}