gpt4 book ai didi

c# - 在异步方法中验证参数

转载 作者:可可西里 更新时间:2023-11-01 08:41:59 24 4
gpt4 key购买 nike

我正在编写一个具有相同方法的同步和异步版本的类void MyMethod(对象参数)Task MyMethodAsync(对象参数)。在同步版本中,我使用简单的检查来验证参数

if (argument == null)
throw new ArgumentNullException("argument");

同样的检查在异步方法中应该是什么样子?

1) 与同步方法相同

2)(第一个回答后更新)

if (argument == null)
return new Task.Factory.StartNew(() => { throw new ArgumentNullException("argument"); });

最佳答案

这有点取决于您希望何时引发错误 - 即急切地或作为可等待的一部分。与迭代器 block 一样,如果你想要急切的错误检查,你需要两种方法,例如:

public Task<int> SomeMethod(..args..) {
if(..args fail..) throw new InvalidOperationException(...);
return SomeMethodImpl(...args...);
}
private async Task<int> SomeMethodImpl(...args...)
{
... await etc ...
}

这将执行任何参数检查作为初始调用的一部分,而不是可等待的。如果你想让异常成为等待的一部分,你可以直接抛出它:

public async Task<int> SomeMethod(..args..) {
if(..args fail..) throw new InvalidOperationException(...);
... await etc ...
}

但是,在您的示例中,您正在返回Task 的事实表明这实际上不是async 方法,而是是一个async(但不是async)方法。你不能只做:

return new Task(() => { throw new ArgumentNullException("argument"); });

因为 Task 永远不会开始 - 永远不会。我怀疑你需要做类似的事情:

try {
throw new InvalidArgumentException(...); // need to throw to get stacktrace
} catch(Exception ex) {
var source = new TaskCompletionSource<int>();
source.SetException(ex);
return source.Task;
}

这是...有点冗长,可能可以封装得更好一些。这将返回一个 Task,表明它处于 Faulted 状态。

关于c# - 在异步方法中验证参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18656379/

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