0

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

所以我想要一个响应式用户界面,并在我的函数调用上放置等待。所以当人点击时,函数将控制权交给 UI 线程。函数试图读取 CDROM,但它真的很脏,所以它向调用者抛出异常。该调用者计算重试次数并继续尝试 3 次。

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

如果我将计数保持在较低级别并且该级别放弃等待,它不能继续重试,直到尝试三次,因为它已被放弃。

但如果我不放弃,我就无法维持响应式 UI。

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

4

1 回答 1

0

您可以将重试逻辑放在最合适的位置。await适用于try

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;
    }
  }
}

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

于 2013-08-22T12:20:10.003 回答