发布
社区首页 >问答首页 >在引发异常的异步期间维护重试状态

在引发异常的异步期间维护重试状态
EN

Stack Overflow用户
提问于 2013-08-22 03:14:03
回答 1查看 170关注 0票数 0

所以我有一个UI线程。人们点击某物是因为他们喜欢它。所以单击会触发一些函数调用。其中一个底层函数调用使用CDROM驱动程序,该驱动程序通过尝试几次读取脏光盘,并进行疯狂的敲击。

因此,我想要一个响应的UI,我把等待在我的函数调用。因此,当person单击时,函数将控制权放弃给UI线程。函数尝试读取CDROM,但是它非常脏,因此它会向调用方抛出异常。该调用者计算重试次数,并继续尝试三次。

所以,如果这一切都在等着,我该把计票记在哪里?

如果我将计数保持在一个较低的级别,而这个级别随着等待而放弃,它就不能继续尝试,直到三次尝试,因为it被放弃了。

但是如果我不放弃,我就无法维护一个响应性UI。

我是否将计数保存在Task对象中?到底哪个线程/等待级别可以负责检查重试计数?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-22 12:20:10

您可以将重试逻辑放在最合适的位置。awaittry工作得非常好

代码语言:javascript
代码运行次数:0
复制
public async Task PerformOperationAsync(int retries)
{
  while (retries != 0)
  {
    try
    {
      await PerformSingleOperationAsync();
      return;
    }
    catch (Exception ex)
    {
      Log(ex);
      --retries;
    }
  }
}

上面的代码如果没有重试,就会忽略失败。还可以抛出最后一个错误:

代码语言:javascript
代码运行次数:0
复制
public async Task PerformOperationAsync(int retries)
{
  while (true)
  {
    try
    {
      await PerformSingleOperationAsync();
      return;
    }
    catch (Exception ex)
    {
      Log(ex);
      if (--retries == 0)
        throw;
    }
  }
}

抛出第一个错误或所有错误的集合作为一个练习留给读者。;)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18371097

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档