在抛出异常的异步期间保持重试状态

时间:2013-08-22 03:14:04

标签: exception asynchronous

所以我有一个UI线程。人们点击某些东西是因为他们觉得这样。所以点击触发一些函数调用。其中一个底层函数调用使用CDROM驱动程序,它通过尝试几次读取脏光盘并使其疯狂地重击。

所以我想要一个响应式UI,我等待我的函数调用。所以当人们点击时,函数放弃对UI线程的控制。函数尝试读取CDROM,但它非常脏,因此它会向其调用者抛出异常。该呼叫者计算重试次数并继续尝试三次。

所以,如果这一切都在等待,我该在哪里保留计数?

如果我将计数保持在较低级别且该级别等待,则在三次尝试之前它无法继续重试,因为它是可靠的。

但如果我不放弃,我就无法维持响应式用户界面。

我是否将计数保留在Task对象中?确切地说哪个线程/等待级别负责检查重试次数?

1 个答案:

答案 0 :(得分:0)

您可以将重试逻辑放在最合适的位置。 awaittry完美契合:

public async Task PerformOperationAsync(int retries)
{
  while (retries != 0)
  {
    try
    {
      await PerformSingleOperationAsync();
      return;
    }
    catch (Exception ex)
    {
      Log(ex);
      --retries;
    }
  }
}

如果重试耗尽,上面的代码将忽略失败。你也可以抛出最后一个错误:

public async Task PerformOperationAsync(int retries)
{
  while (true)
  {
    try
    {
      await PerformSingleOperationAsync();
      return;
    }
    catch (Exception ex)
    {
      Log(ex);
      if (--retries == 0)
        throw;
    }
  }
}

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