代表的演变

The*_*let 5 c# history multithreading delegates

我试图了解代表的演变。除了了解之前发生的事情之外,如何更好地理解这一点呢?据我所知,委托的概念来自于C++中的函数指针。

\n\n

1. 引入函数指针的主要原因是什么?是不是支持多线程?

\n\n
\n

Henk Holterman:委托/函数指针的存在是为了提供一定程度的灵活性。方法的选择可以与其调用分离。

\n
\n\n

我在查看这个出色的线程资源时被介绍给代表

\n\n

http://www.albahari.com/threading/

\n\n

这是 Joe Albahari 关于异步委托的说法:

\n\n
\n

ThreadPool.QueueUserWorkItem\xe2\x80\x99t 不提供一种简单的机制,用于在线程执行完成后从\n 获取返回值。异步委托调用(简称异步委托)解决了这个问题,允许双向传递任意数量的类型化参数。此外,异步委托上未处理的异常可以方便地在原始线程(或更准确地说,调用的线程EndInvoke)上重新引发,因此它们不需要显式处理。

\n
\n\n

*2. 所有委托本质上都是异步的吗?

\n\n
\n

Jon:委托是指向代码的指针。它本质上既不是同步也不是异步;调用它的方式和返回的结果决定了这一点。

\n\n

Henk Holterman:当你有一个委托实例 f 时,你可以同步调用 f() 或者异步调用 f.BeginInvoke()

\n
\n\n
    \n
  1. 除了事件之外,异步委托还有其他用途吗?
  2. \n
\n\n
\n

dasblinkenlight:异步 API 中委托有多种用途,例如.NET 异步 I/O

\n
\n\n
    \n
  1. C# 中的委托/线程支持在各个版本中是如何演变的?
    *
  2. \n
\n\n
\n

dasblinkenlight:委托的核心支持保持不变,但该语言添加了许多重要的功能,以使其更方便地定义委托。

\n
\n\n

C# 2.0:引入匿名委托
\nC# 3.5:添加了 lambda 表达式
\nC# 4.0:添加了任务并行库。

\n\n

编辑:我的大部分疑问都已得到澄清。如果我能为代表们提供一份“历史”并为他们提供更多实际用途,那就太好了!

\n

das*_*ght 4

  1. 引入委托的主要原因是提供一种操作可执行代码片段的机制:存储指向它的指针、传递给函数、组织数据结构等等。

  2. 与所有函数调用一样,调用单个委托是同步的,即调用者必须等待委托完成才能取回控制权。但是,您可以使用委托通过传递一段可以稍后存储和执行(异步)的代码来实现异步 API。

  3. 委托在异步 API 中有很多用途,例如.NET 异步 I/O

  4. 委托的核心支持保持不变,但该语言添加了许多重要的功能,以便更方便地定义委托。例如,C#2.0 添加了匿名委托,C#3.5 添加了 lambda。