“hissy fit”的原因是编译器需要做大量的工作,以呈现一个在所有预期的正确方式下都能正常工作的任务,您可以通过编译和反编译来看到这一点
by compiling and decompiling it。
Task.FromResult
更加简洁,但可能仍然存在开销——如果我没记错的话,在某些情况下,
Task.FromResult
可能会有效地工作(每次返回相同的对象),但我不会依赖它。
有两种实用可靠的方法:
- 每次返回重复使用的静态
Task<bool>
结果
- 使用
ValueTask<bool>
——如果您大部分时间都在同步返回,则似乎在这里是理想的
即。
private readonly static Task<bool> s_False = Task.FromResult(false);
public Task<bool> Contains(string key, string scope)
{
return s_False ;
}
或者
public ValueTask<bool> Contains(string key, string scope)
{
return new ValueTask<bool>(false);
}
注意:在这种情况下,第二个可能不可行,因为您没有定义接口。但是:如果您曾经设计需要允许异步使用但实际上可能是同步的接口,请考虑使用
ValueTask<T>
作为交换类型,而不是
Task<T>
。
生成的 C# 代码如下:
public async System.Threading.Tasks.Task<bool> Contains(string key, string scope)
{
return false;
}
类似于:
[StructLayout(LayoutKind.Auto)]
[CompilerGenerated]
private struct <Contains>d__0 : IAsyncStateMachine
{
public int <>1__state;
public AsyncTaskMethodBuilder<bool> <>t__builder;
private void MoveNext()
{
bool result;
try
{
result = false;
}
catch (Exception exception)
{
<>1__state = -2;
<>t__builder.SetException(exception);
return;
}
<>1__state = -2;
<>t__builder.SetResult(result);
}
void IAsyncStateMachine.MoveNext()
{
this.MoveNext();
}
[DebuggerHidden]
private void SetStateMachine(IAsyncStateMachine stateMachine)
{
<>t__builder.SetStateMachine(stateMachine);
}
void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
{
this.SetStateMachine(stateMachine);
}
}
[AsyncStateMachine(typeof(<Contains>d__0))]
public Task<bool> Contains(string key, string scope)
{
<Contains>d__0 stateMachine = default(<Contains>d__0);
stateMachine.<>t__builder = AsyncTaskMethodBuilder<bool>.Create();
stateMachine.<>1__state = -1;
AsyncTaskMethodBuilder<bool> <>t__builder = stateMachine.<>t__builder;
<>t__builder.Start(ref stateMachine);
return stateMachine.<>t__builder.Task;
}
public bool Contains(..)
? - Panagiotis Kanavosasync
操作,为什么你想为了你的“小方便”而创建一个状态机呢?你可以自己简单地返回一个Task
。 - FabjanTask.FromResult
的情况。当接口允许异步调用者,但实现是同步的时候。 - ChristianMurschallIProvider
并且您正在尝试实现它,那么您就没有太多选择。 - Damien_The_Unbeliever