gpt4 book ai didi

c# - 如果 Task.Delay 未标记为异步,它如何等待?

转载 作者:太空狗 更新时间:2023-10-29 19:53:40 28 4
gpt4 key购买 nike

我正在查看在 ILSpy 中反编译的 Task.Delay(int):

// System.Threading.Tasks.Task
[__DynamicallyInvokable]
public static Task Delay(int millisecondsDelay)
{
return Task.Delay(millisecondsDelay, default(CancellationToken));
}

此方法的用法类似于await Task.Delay(5000);,智能感知甚至会显示“(awaitable)”:

enter image description here

那么 Task.Delay(int) 怎么没有被标记为 async (public static async Task Delay(int millisecondsDelay) )?

最佳答案

等待的是Task Task.Delay返回。每个方法返回一个 Task/Task<TResult>是可以等待的。 async只是一个实现细节,允许您使用 await在该方法及其生成的整个状态机中。

更一般地说,每个东西都有GetAwaiter方法 ( extension methods count as well ) 返回具有 IsCompleted东西 , OnCompletedGetResult可以等待。

例如,Task.Yield返回 YieldAwaitable这不是 Task看起来像这样:

public struct YieldAwaiter : ICriticalNotifyCompletion, INotifyCompletion
{
public void OnCompleted(Action continuation);
public void UnsafeOnCompleted(Action continuation);
public void GetResult();
public bool IsCompleted { get; }
}

* UnsafeOnCompleted这里只是一个优化,await没有它也能工作。

重要的是要注意,这种情况下的编译器(与其他情况相同,例如 GetEnumerator 对于 foreach )不需要接口(interface)或基类。它基本上使用 duck typing (即 “如果它像鸭子一样走路......”)并简单地寻找 GetAwaiter返回具有其他 3 个成员(IsCompletedOnCompletedGetResult)的任何内容(无论是什么类型或接口(interface),或者它是类还是结构)的方法

例如,您可以这样制作 await "bar"编译(当然会在运行时失败):

public static Awaiter GetAwaiter(this string s)
{
throw new NotImplementedException();
}
public abstract class Awaiter : INotifyCompletion
{
public abstract bool IsCompleted { get; }
public abstract void GetResult();
public abstract void OnCompleted(Action continuation);
}

总之,你不需要async返回一个等待的而且Task -.Net 框架中的返回方法不使用它并显式返回 Task .

关于c# - 如果 Task.Delay 未标记为异步,它如何等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28236797/

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