**注意我已经问过这个被标记为重复的问题,但重复的问题没有帮助解决我在下面的问题。
使用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方法签名是无效的 - 是否应该更改为其他内容?
答案 0 :(得分:0)
UpdateCarWithTicketId
会返回Task<string>
而不是string
。你可以通过做这样的事情来获得string
:
public async void AddCars(List<Cars> cars)
{
var ticketId = await UpdateCarWithTicketId(cars);
string test = "Hello-World";
}