C# 在.NETCore中调用外部服务时,如何等待异步方法完成?

C# 在.NETCore中调用外部服务时,如何等待异步方法完成?,c#,asp.net-core,async-await,C#,Asp.net Core,Async Await,我已经看到了一些关于异步等待完成的现有问题,但是对于我来说,这些解决方案都不起作用 我正在使用C#包装器连接到销售人员 在下面的方法中,我想等待方法UsernamePasswordAsync完成执行,以便从auth对象获取值 public async Task<Token> GetTokenForSalesForce() { Token token = null; try { var auth = new AuthenticationClien

我已经看到了一些关于异步等待完成的现有问题,但是对于我来说,这些解决方案都不起作用

我正在使用C#包装器连接到销售人员

在下面的方法中,我想等待方法UsernamePasswordAsync完成执行,以便从auth对象获取值

public async Task<Token> GetTokenForSalesForce()
{
    Token token = null;
    try
    {
        var auth = new AuthenticationClient();
         await auth.UsernamePasswordAsync(configuration.Value.ClientId, configuration.Value.ClientSecert,
                                         configuration.Value.SFUsername, configuration.Value.SFPassword,
                                         configuration.Value.SFBaseUrl);
        if (!string.IsNullOrEmpty(auth.AccessToken) && !string.IsNullOrEmpty(auth.InstanceUrl))
        {
            token = new Token
            {
                BearerToken = auth.AccessToken,
                InstanceURL = auth.InstanceUrl,
                ApiVersion = auth.ApiVersion
            };
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }
    return token;
}

public async Task<List<SFDashboardResponse>> GetOrderCountFromSalesForce(Token token)
{
    List<SFDashboardResponse> sFDashboardResponses = new List<SFDashboardResponse>();
    try
    {
        var client = new ForceClient(token.InstanceURL, token.BearerToken, token.ApiVersion);
        var response = await client.QueryAsync<SFDashboardResponse>("SELECT something ");
        var records = response.Records;
    }
    catch(Exception e)
    {

    }
    return sFDashboardResponses;
}
问题是,当方法等待等待被首先执行时,另一个线程执行原始调用程序的另一部分

我从这里叫它

public IActionResult post()
{
    var authtoken = _salesForceService.GetTokenForSalesForce();
    var response = _salesForceService.GetOrderCountFromSalesForce(authtoken.Result);
    DashboardModel dashboardModel = null;
    if (authtoken.Status == TaskStatus.RanToCompletion)
    {
       fill the object
    }

     return Ok(dashboardModel);
 }

您可以在下面的任务中使用
Task
wait
包装
IActionResult

public async Task<IActionResult> post()
{
    var authtoken = await _salesForceService.GetTokenForSalesForce();
    var response = await _salesForceService.GetOrderCountFromSalesForce(authtoken);

    DashboardModel dashboardModel = //fill the object

    return Ok(dashboardModel);
}
您只需在
Configure
方法中将其注册为中间件,如下所示:

app.UseMiddleware<ErrorHandlingMiddleware>();
app.UseMiddleware();

您可以使用
任务
等待
对下面的任务进行包装

public async Task<IActionResult> post()
{
    var authtoken = await _salesForceService.GetTokenForSalesForce();
    var response = await _salesForceService.GetOrderCountFromSalesForce(authtoken);

    DashboardModel dashboardModel = //fill the object

    return Ok(dashboardModel);
}
您只需在
Configure
方法中将其注册为中间件,如下所示:

app.UseMiddleware<ErrorHandlingMiddleware>();
app.UseMiddleware();

我很感激那些投票否决某个问题的人,如果你能给它一个理由,那就太好了其中
ex
是捕获的异常。您将丢失堆栈跟踪。只要做
将保留堆栈跟踪。如果你唯一要做的就是重新抛出异常,那么不要捕捉异常。并且代码中没有空的catch块。至少要记录异常情况。@如果您是正确的。记录器正在由另一个人实施。一旦完成,它将在catch块中使用。您不会等待异步任务,因此代码当然会继续。这就是重点。我很感激那个些投票否决某个问题的人,若你们给它加上一个理由,那个就好了,永远不要扔X其中
ex
是捕获的异常。您将丢失堆栈跟踪。只要做
将保留堆栈跟踪。如果你唯一要做的就是重新抛出异常,那么不要捕捉异常。并且代码中没有空的catch块。至少要记录异常情况。@如果您是正确的。记录器正在由另一个人实施。一旦完成,它将在catch块中使用。您不会等待异步任务,因此代码当然会继续。这就是重点。