CLR 定义的方法(例如 [delegate].BeginInvoke)记录在哪里? [关闭]

2024-01-12

[编辑,完全改写:] 看来我的问题措辞确实不好,而且也没有得到很好的回应。所以我希望这个完整的改写能有所帮助......


Control.Begin/End/Invoke() 和 Dispatcher.Begin/End/Invoke() 方法与委托的 Begin/End/Invoke() 方法具有相同的名称和有些相似的行为,但最好放弃它们的想法是相同的。最重要的区别是委托的方法是类型安全,这是 Control 和 Dispatcher 版本中完全缺失的。运行时行为也非常不同。

CLI 规范中详细说明了管理委托的规则,ECMA 335 http://www.ecma-international.org/publications/standards/Ecma-335.htm,第二章 14.6。最好看一下这一章,我只给出一个概要。

委托声明被转换为继承自 MulticastDelegate 的类(不是 CLI 规范中指定的 Delegate)。该类始终只有 4 个成员,它们的运行时实现由 CLR 提供:

  • 一个接受一个对象和一个 IntPtr 的构造函数。该对象是Delegate.Target,IntPtr是目标方法Delegate.Method的地址。稍后当您调用委托时将使用这些成员,Target 属性提供this如果委托绑定的方法是实例方法,则引用;对于静态方法,则为 null。 Method 属性决定调用哪个方法。您不必直接指定这些参数,编译器会在您使用 new 运算符或使用 += 运算符订阅事件处理程序时提供它们。在事件的情况下有很多语法糖,您不必使用new显式地操作符。

  • Invoke() 方法。该方法的参数是动态生成的并且与委托声明匹配。调用 Invoke() 方法在同一线程上运行委托目标方法,同步称呼。您很少在 C# 中使用它,您只是使用语法糖,该语法糖允许仅使用对象名称后跟括号来调用委托对象。

  • BeginInvoke() 方法,提供了一种方法来创建异步称呼。当目标方法忙于执行时,该方法会快速完成,类似于 ThreadPool.QueueUserWorkItem 但具有类型安全参数。返回类型始终为 System.IAsyncResult,用于查明异步调用何时完成并提供给 EndInvoke() 方法。第一个参数是一个可选的 System.AsyncCallback 委托对象,异步调用完成时将自动调用它的目标。第二个参数是可选的object,它将按原样传递给回调,对于跟踪状态很有用。其他参数是动态生成的并与委托声明匹配。

  • EndInvoke() 方法。它需要一个 IAsyncResult 类型的参数,您必须传递从 BeginInvoke() 获得的参数。它完成异步调用并释放资源。

您在委托对象上看到的任何其他方法都是从基类 MulticastDelegate 和 Delegate 继承的方法。与 DynamicInvoke() 和 GetObjectData() 类似。

异步调用是比较棘手的,您很少需要使用它们。事实上,它们在 .NETCore 目标(例如 Silverlight)中不可用。委托目标方法在任意线程池线程上运行,就像 Threadpool.QueueUserWorkItem() 一样。它可能抛出的任何未处理的异常都会被捕获并终止线程,但不会终止您的程序。你must调用EndInvoke(),不这样做会导致资源泄漏10分钟。如果目标方法抛出异常,那么当您调用 EndInvoke() 时,该异常将会重新引发。您无法控制线程池线程,无法取消或中止它。 Task 或 Thread 类是更好的选择。

MSDN是相关的,委托类型的方法是not记录在案。它假设您从规范和委托声明中知道它们的作用以及它们的外观。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CLR 定义的方法(例如 [delegate].BeginInvoke)记录在哪里? [关闭] 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现

随机推荐