gpt4 book ai didi

c# - 捕获 TaskCanceledException 并检查 Task.Canceled 是个好主意吗?

转载 作者:IT王子 更新时间:2023-10-29 04:38:27 28 4
gpt4 key购买 nike

我的团队中有一些人非常喜欢使用异步 Task 进行编码。有时他们喜欢使用 CancellationToken 参数。

我不确定的是我们作为一个团队是否应该使用这种代码风格 (A):

async Task<someObject> DoStuff(CancellationToken t)
{
while (!t.IsCanceled)
{
try {
Task.Delay(5000, t);
}
catch (AggregateException e) // or is it TaskCanceledException or OperationCanceledException? I don't know? :)
{
}
// poll something, return someObject, or null
}
return null;
}

这显然意味着调用者可能必须自己检查取消 token 以确定是否继续处理,并且他们可能必须处理 null retVals:

var retVal = await DoStuff(token);
if (token.IsCanceled) { ... }

但是,如果我们采用依赖于 TaskCanceledException 的第二种代码风格(B):

async Task<someObject> DoStuff(CancellationToken t)
{
while(true)
{
Task.Delay(5000, t);
// poll something, return someObject, or null
}
}

实现代码绝对更简单 - 调用者可以选择是否处理异常,视情况而定......但我不禁担心调用者可能忘记 TaskCanceledException 是什么东西他们不得不担心,进程可能会因为没有捕获这些异常(在前台或后台线程上)而崩溃。

因此,我的措辞过于乐观的问题是:您认为每个人应该始终使用的最佳风格是什么,为什么? :)

最佳答案

当您传递 CancellationToken 时,在 .Net 框架本身中作为参数你会得到一个 TaskCanceledException .我不会反对并创建自己的设计模式,因为熟悉 .Net 的人会熟悉您的代码。

我的准则是:取消 token 的那个应该处理 TaskCanceledException,所以如果您在方法中使用 CancellationToken自己的原因,继续使用 try-catch block 。 但是如果你获取token作为参数,让异常抛出

关于c# - 捕获 TaskCanceledException 并检查 Task.Canceled 是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24559416/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com