c# - 重构 C# try catch 与服务器异步任务返回的建议
问题描述
关于方法
- 当会话有效时,它应该将数据发布到服务器端。
- [本地检查会话] - [刷新] - [发送数据]
- [如果发生 401] - [刷新] - [发送数据]
我不确定
- 如果“IF”条件和“try-catch”块中有任何冗余,则可以简化。
- 另外,不熟悉任务和异步的东西,将“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
}
}
编辑:
在那里添加了一个简单的流程
解决方案
你现在拥有的至少是非常可读的。
您正在用“刷新”和“发送数据”重复自己,但鉴于我可以在一个屏幕上看到所有工作流和故障点,我认为这比更通用的方法更重要。
我要更改此设置的唯一原因是刷新或发送数据功能变得不重要并干扰了对身份验证工作流程的理解。
如果您确实想将其重新构建为练习,我认为您正在寻找的技术是“延续任务”。
推荐阅读
- python - 如何用python计算一些数据?
- google-cloud-platform - 使用 gcloud 工具时,我可以在 Google Cloud Speech-to-Text api 中指定模型(例如“视频”)吗?
- r - case_when 在一个实例中起作用,而不是在另一个实例中
- ruby-on-rails - Rails:“浅层”选项究竟对我们有什么好处?
- ios - 使用 sentry-expo 发送自定义 iOS 原生错误
- python - 如何比较两个 NewsItem 列表并减去相同的 NewsItem?
- python - AttributeError:“模块”对象在脚本中没有属性“_Condition”
- google-apps-script - 检索 Google 电子表格中所有表格的值以进行特定修订
- c++ - 'std::bad_alloc' 尝试删除 priority_queue 元素 C++
- r - 对大量图像文件进行分类