在很多关于C#的async / await的讨论中,我看到有人提到术语"自然异步"或"纯异步"。这些术语到底意味着什么?
"自然异步"的一些例子是什么?操作,为什么这样称呼?
"非自然异步"的一些例子是什么?操作,为什么?
答案 0 :(得分:13)
几乎总是I / O.
自然异步操作是不需要CPU的操作,例如通过网络发送数据或从硬盘驱动器读取数据。它们不需要任何计算,因此CPU可以在运行时执行其他任务。
还有一些逻辑操作不需要线程,例如等待超时到期,或等待同步构造(例如AsyncLock
)
异步但非自然异步的操作是在后台线程上执行的CPU操作。这些对于响应性(例如对于UI应用程序)非常有用,但由于它们仍然需要相同数量的资源,因此不会提高性能或可伸缩性。
所以你有:
异步运行的自然异步操作:
await Task.Delay(1000);
同步运行的自然异步操作:
Thread.Sleep(1000);
异步运行的自然同步操作:
await Task.Run(() => CalculateSquareRoot(5));
同步运行的自然同步操作:
CalculateSquareRoot(5);