我有以下两种方法
public async Task<bool> DoSomething(CancellationToken.token)
{
//do something async
}
//overload with None token
public /*async*/ Task<bool> DoSomething()
{
return /*await*/ DoSomething(CancellationToken.None);
}
是否应该使用async / await关键字标记第二种方法?
答案 0 :(得分:12)
它不需要 - 如果你在第二种方法中使用await / async,你将增加额外的开销,在这种情况下什么也不做。
DoSomething(CancellationToken)
内部的异步工作已经为您提供了适当的异步处理和封送回现有的上下文。
在一天结束时,async
和await
实际上只是语言功能,可以轻松创建和撰写Task
。如果您已经有一个非常好的Task
返回,则无需使用额外的语言支持来解包并将其重新包装为新的Task
。
答案 1 :(得分:11)
要添加到里德的好答案,请以这种方式思考:
Func<int, int> GetFunc()
{
Func<int, int> f = GetFunc(someParameter);
你应该说
return f;
或理由&#34;我应该在这里返回一个函数,所以让我们做一个调用我手边的函数的lambda&#34;:
return (int i) => f(i);
我希望你能做到前者;你手头已经有Func<int, int>
了,所以就回来吧。不要做一个调用func的函数。
如果你有
IEnumerable<int> GetSequence()
{
IEnumerable<int> sequence = GetSequence(someParameter);
你会说吗?
return sequence;
或
foreach(int item in sequence) yield return item;
?我再次希望你能做到前者。你手头有一个序列,那么为什么要制作一个列举旧序列的新序列呢?
任务也是如此;就像你可以创建一个包装另一个委托的委托和一个包装另一个序列的序列一样,你可以创建一个包装另一个任务的任务,但为什么会这样呢?这只是浪费资源。