所以我有一个UI线程。人们点击某些东西是因为他们觉得这样。所以点击触发一些函数调用。其中一个底层函数调用使用CDROM驱动程序,它通过尝试几次读取脏光盘并使其疯狂地重击。
所以我想要一个响应式UI,我等待我的函数调用。所以当人们点击时,函数放弃对UI线程的控制。函数尝试读取CDROM,但它非常脏,因此它会向其调用者抛出异常。该呼叫者计算重试次数并继续尝试三次。
所以,如果这一切都在等待,我该在哪里保留计数?
如果我将计数保持在较低级别且该级别等待,则在三次尝试之前它无法继续重试,因为它是可靠的。
但如果我不放弃,我就无法维持响应式用户界面。
我是否将计数保留在Task对象中?确切地说哪个线程/等待级别负责检查重试次数?
答案 0 :(得分: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;
}
}
}
抛出第一个错误或所有错误的集合留给读者练习。 ;)