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