对外部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是无效的-应该改变为其他东西吗?
UpdateCarWithTicketId
返回的是Task<string>
而不是string
。您可以通过以下操作从中获得string
:
public async void AddCars(List<Cars> cars)
{
var ticketId = await UpdateCarWithTicketId(cars);
string test = "Hello-World";
}