Как ждать завершения асинхронного метода при вызове внешнего сервиса в ядре .net? - PullRequest
0 голосов
/ 28 августа 2018

Я видел некоторые из существующих вопросов относительно асинхронного ожидания, ожидающего завершения, однако для меня ни одно из решений не работает.

Я использую оболочку C # для подключения к отделу продаж https://github.com/developerforce/Force.com-Toolkit-for-NET/

В приведенном ниже методе я хочу дождаться, пока метод 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 async Task WebServerAsync(string clientId, string clientSecret, string redirectUri, string code, string tokenRequestEndpointUrl)
{
}

Проблема заключается в том, что в то время как метод ожидает ожидания, прежде чем он будет выполнен, другой поток выполняет другую часть исходного вызова.

Я звоню отсюда

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);
 }

1 Ответ

0 голосов
/ 28 августа 2018

Вы можете обернуть IActionResult с помощью Task и await в следующих задачах.

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

    DashboardModel dashboardModel = //fill the object

    return Ok(dashboardModel);
}

По крайней мере, это то, что вы просите, насколько я понимаю, если это еще одна проблема, дайте мне знать.

РЕДАКТИРОВАТЬ 1:

Это всего лишь мое предложение / мнение.

Лично мне не очень нравится, когда код везде упакован в try-catch, поэтому код может быть трудно читать и поддерживать. Вы действительно должны рассмотреть возможность централизованной обработки исключений в одном месте, у вас может быть базовый контроллер или просто промежуточное программное обеспечение, подобное этому:

public class ErrorHandlingMiddleware
{
    private readonly RequestDelegate _next;

    public ErrorHandlingMiddleware(RequestDelegate next)
    {
        this._next = next;
    }

    public async Task Invoke(HttpContext context, ILogger logger)
    {
        try
        {
            await _next(context);
        }
        catch (Exception ex)
        { 
            await HandleExceptionAsync(context, ex, logger);
        }
    }

    private static Task HandleExceptionAsync(HttpContext context, Exception exception, ILogger logger) 
    {
        logger.Log(exception);
        //do something
        return context.Response.WriteAsync(... something ...); //Maybe some JSON message or something
    }
}

Вы просто регистрируете его как промежуточное ПО в методе Configure, как показано ниже:

app.UseMiddleware<ErrorHandlingMiddleware>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...