C# 未捕获异步异常

C# 未捕获异步异常,c#,asynchronous,C#,Asynchronous,我有一个windows服务,它引用了以下代码。使用下面方法的我的代码包含一个try..catch块,但它似乎没有catchRefereshTokenException,该异常在下面的方法中被抛出。显然,我对async的理解是不正确的 private async void RefreshTokens() { try { var cognito = new CognitoApi(); var response = cognito.TokenRefres

我有一个windows服务,它引用了以下代码。使用下面方法的我的代码包含一个
try..catch
块,但它似乎没有
catch
RefereshTokenException
,该异常在下面的方法中被抛出。显然,我对
async
的理解是不正确的

private async void RefreshTokens()
{
    try
    {
        var cognito = new CognitoApi();
        var response = cognito.TokenRefresh(_refreshToken);

        if (response.HttpStatusCode == HttpStatusCode.OK)
        {
            _idToken = new AwsToken(response.AuthenticationResult.IdToken);
            _accessToken = new AwsToken(response.AuthenticationResult.AccessToken);
        }
        else
        {
            await _signIn(_credentials.SiteId, _credentials.LocationId, null);
        }
    }
    catch (NotAuthorizedException)
    {
        await _signIn(_credentials.SiteId, _credentials.LocationId, null);
    }
    catch (Exception ex)
    {
        throw new RefreshTokenException("Failed refreshing tokens.", ex);
    }
}
这是调用刷新令牌的代码

public async void Process(QueueMessage queueMessage, Action<QueueMessage> retryAction)
{
    _processingCounter.Increment();

    try
    {
        ......
        IAwsToken idToken = authenticationService.Tokens.IdToken; //This is the code that calls "RefreshTokens" method
        ........
    }
    catch (Exception ex)
    {
        //Code never reaches here...
        _logger.Error("Error in ProcessMessage", ex);
    }

    _processingCounter.Decrement();
}
公共异步无效进程(QueueMessage,Action retryAction)
{
_processingCounter.Increment();
尝试
{
......
IAwsToken idToken=authenticationService.Tokens.idToken;//这是调用“refreshttokens”方法的代码
........
}
捕获(例外情况除外)
{
//代码永远不会到达这里。。。
_logger.Error(“ProcessMessage中的错误”,ex);
}
_处理计数器。减量();
}

这是一个
异步无效
。避免异步void方法的主要原因之一是您无法处理它们引发的异常

将其设置为
异步任务
,并在调用者中等待它

请注意,在该调用程序中,您会遇到相同的问题,
async void Process(…)


把它也变成一个
异步任务
,然后一路向上。async/await应该形成一个链,从GUI或控制器到异步I/O调用

这是一个
异步无效
。避免异步void方法的主要原因之一是您无法处理它们引发的异常

将其设置为
异步任务
,并在调用者中等待它

请注意,在该调用程序中,您会遇到相同的问题,
async void Process(…)


把它也变成一个
异步任务
,然后一路向上。async/await应该形成一个链,从GUI或控制器到异步I/O调用

回答。。。不要使用
async void
,请对此进行研究并阅读。回答。。。不要使用
async void
,请对此进行研究并阅读。谢谢,我会留意的。你也不能等他们。谢谢,我会留意的。你也不能等他们。