C# try catch with server async Task 的重构建议 return

Refactor suggestion for C# try catch with server async Task return

关于方法

  1. 会话有效时应该post向服务器端发送数据
  2. [本地检查会话]-[刷新]-[发送数据]
  3. [如果发生 401] - [刷新] - [发送数据]

我不确定

  1. 如果 "IF" 条件和 "try-catch" 块中有任何冗余,可以简化。
  2. 此外,不熟悉 Task 和异步的东西,将 "PendRefresh" 任务放入其中的方式是否正确或合适?

感谢任何建议!

private async Task<TResult> PostRequestAsync<TResult>(ServerRequest request)
{
    //check if expired on client side
    if (LocalHelper.IsExpired(request))
    {
        request.Token = await PendRefresh().ConfigureAwait(false);      //[Refresh]
    }

    try
    {
        return await PostServerAsync<TResult>(request).ConfigureAwait(false);   //[Send Data]
    }
    catch (ServerException e)
    {
        //session expired on the server side
        if (e.Code == HttpStatusCode.Unauthorized)
        {
            request.Token = await PendRefresh().ConfigureAwait(false);              //[Refresh]
            return await PostServerAsync<TResult>(request).ConfigureAwait(false);   //[Send Data]
        }
    }
    return default;

    //Q2, is this OK?
    async Task<string> PendRefresh()
        {
        //something here
    }
}

编辑:

在那里添加了一个简单的流程

至少你现在的可读性很好。

您在 "refresh" 和 "send data" 上重复了一些内容,但考虑到我可以在一个屏幕上看到所有的工作流程和故障点,我认为它比更通用的方法更重要.

我要更改它的唯一原因是,如果刷新或发送数据功能变得非常重要,并且会干扰对身份验证工作流程的理解。

如果您确实想将其重新设计为练习,我认为您正在寻找的技术是“continuation task”。