gpt4 book ai didi

c# - 异步方法和异步委托(delegate)

转载 作者:可可西里 更新时间:2023-11-01 09:06:55 29 4
gpt4 key购买 nike

C# 3.0 简述异步方法异步委托(delegate)看起来很相似,但行为却大不相同.

这是书中关于两者的说法。

异步方法

  1. 很少或从不阻塞任何线程。
  2. Begin 方法可能不会立即返回给调用者。
  3. 商定的协议(protocol),不支持 C# 语言。

异步委托(delegate)

  1. 可以阻止任何时间长度
  2. BeginInvoke 立即返回给调用者。
  3. 内置编译器支持。

书上还说,异步方法的目的是让很多任务在很少的线程上运行;异步委托(delegate)的目的是与调用者并行执行任务

当我通过反射器查看 System.IO.Stream 类中的 BeginRead() 方法时,它使用委托(delegate)并调用 BeginInvoke 关于那个。因此,异步方法在内部使用异步委托(delegate)。

  1. 在这种情况下,怎么能说他们的行为不同呢?由于它在内部使用委托(delegate),因此如何进行上述比较?
  2. 您认为使用委托(delegate)的 BeginXXX 方法是与调用者并行执行函数的方法吗?
  3. 通过保持所有优点(如充分利用 CPU)来实现异步方法的正确方法是什么?

有什么想法吗?

最佳答案

当您通过回调调用 BeginFoo() 时,您可能会看到两种主要行为。

  1. 工作在后台线程上启动,该线程将一直使用,直到工作完成并调用回调(例如,因为工作是同步的)。
  2. 虽然一些工作发生在后台线程上,但线程不需要一直处于使用状态(例如,因为工作涉及系统 IO,它可以在 IOCompletionPort 上安排回调)。

当您使用委托(delegate)时,会发生上述行为 #1。

一些 API(具有对非阻塞 IO 调用的底层支持)支持行为 #2。

在“Stream”的具体情况下,我不确定,但我猜测它是一个抽象基类,因此这只是仅实现同步版本 Read 的子类的默认行为。 “好的”子类将覆盖 BeginRead/EndRead 以实现非阻塞。

正如您所说,#2 的优势在于您可以拥有例如100 个挂起的 IO 调用而不消耗 100 个线程(线程很昂贵)。

关于c# - 异步方法和异步委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1418392/

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