超时与备用策略
限制等待时间并提供优雅的备用方案。
超时与备用策略 是 CoddyKit 上的免费 C# Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 4 节课。
为什么超时很重要
永远不返回的调用比直接失败的调用更糟糕:它会占用线程和连接。超时策略会限制操作允许运行的时间,时间到后 Polly 会取消操作。
添加超时
Polly v8 提供 AddTimeout。超过限制后,它会抛出 TimeoutRejectedException 并取消底层令牌。
using Polly.Timeout;
var pipeline = new ResiliencePipelineBuilder()
.AddTimeout(TimeSpan.FromSeconds(3))
.Build();协作式取消
超时机制会取消传递给您的回调的 CancellationToken。您的代码必须遵守该令牌,超时才能及时生效。
await pipeline.ExecuteAsync(async token =>
{
// token is cancelled when the timeout fires
await httpClient.GetAsync(url, token);
});响应超时
使用带有 OnTimeout 回调的 TimeoutStrategyOptions,在操作被提前终止时记录日志或发出指标。
new TimeoutStrategyOptions
{
Timeout = TimeSpan.FromSeconds(3),
OnTimeout = args =>
{
Console.WriteLine($"Timed out after {args.Timeout}");
return default;
}
};什么是回退
回退会在操作失败时提供替代结果,让用户获得平稳的降级体验,而不是看到错误:例如 cached 数据、默认值或友好的消息。
添加回退策略
AddFallback 需要一个带类型的管道。您需要定义要处理的故障,以及要返回的替代值。
using Polly.Fallback;
var pipeline = new ResiliencePipelineBuilder<string>()
.AddFallback(new FallbackStrategyOptions<string>
{
ShouldHandle = new PredicateBuilder<string>()
.Handle<HttpRequestException>(),
FallbackAction = args =>
Outcome.FromResultAsValueTask("cached default")
})
.Build();返回缓存数据作为回退
一种常见模式是在实时调用失败时提供缓存中最后一个已知正常的值,从而让应用保持响应。
FallbackAction = args =>
{
var cached = _cache.GetLastKnownGood();
return Outcome.FromResultAsValueTask(cached);
}观察回退
OnFallback 回调会在执行回退时触发,非常适合记录应用采用了降级路径。
new FallbackStrategyOptions<string>
{
FallbackAction = args => Outcome.FromResultAsValueTask("default"),
OnFallback = args =>
{
Console.WriteLine("Fallback executed");
return default;
}
};同时使用超时和回退
将两者结合起来非常有效:超时限制等待时间,回退则在发生超时(或任何已处理的故障)时提供一个值,因此调用方既不会一直等待,也不会崩溃。
选择合理的超时时间
应根据实际延迟再加上合理余量来设置超时时间,而不是任意使用很小的值。限制过严会使正常调用失败;限制过宽则会失去超时的意义。
回退是最后的手段
应将回退放在最外层策略中,这样它就能捕获来自重试、熔断器和超时的各种故障,确保调用方始终获得可用结果。
快速检查
测试超时和回退策略。
回顾
超时通过 AddTimeout 限制操作持续时间,取消令牌并抛出 TimeoutRejectedException(请务必遵守该令牌!)。回退通过带有 FallbackAction 的 AddFallback 提供替代结果,通常会返回缓存数据。两者结合可以让应用保持响应:先限制等待时间,再平稳降级。将回退放在最外层,使其能够捕获所有已处理的故障。
常见问题解答
「超时与备用策略」课时是免费的吗?
是的 — 「超时与备用策略」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 4 节课。
「超时与备用策略」这节课中我会学到什么?
限制等待时间并提供优雅的备用方案。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 C# Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。
「超时与备用策略」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 C# Academy 课中编写并运行代码吗?
能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。