【问题标题】:Do both BeginInvoke and EndInvoke on delegates generate full fences?代表上的 BeginInvoke 和 EndInvoke 是否都会生成完整的围栏?
【发布时间】:2011-07-20 09:10:40
【问题描述】:

Threading in C# by Joseph Albahari 对此进行了简短的讨论,并表示:

以下隐式生成完整的栅栏:

  • C# 的锁定语句 (Monitor.Enter/Monitor.Exit)
  • Interlocked 类的所有方法(我们很快就会介绍)
  • 使用线程池的异步回调——包括 异步委托、APM 回调和任务延续
  • 设置和等待信号结构
  • 任何依赖于信号的事情,例如启动或等待任务

由于“异步委托”在列表中,我假设至少 EndInvoke 是完全隔离的。但是 BeginInvoke 呢?不幸的是,我无法 F11(= 调试步骤)进入 BeginInvoke 代码 - 源代码在某处可用吗?虽然指向明确答案的链接会更好。

【问题讨论】:

  • (BeginInvoke 由运行时本身提供;实际上并没有任何来源)
  • 你的意思是他们直接用机器代码开发了这两种方法? ;) 但老实说,很高兴知道在线程安全方面是否有任何保证,与是否有办法查看 MS 的源代码无关。我在“最新标准”的第二部分和第四部分或我从 [msdn.microsoft.com/en-us/netframework/aa569283.aspx]
  • 不一定是机器码,可能是 C 或 C++。如果你真的想看它,你可以下载 Mono 源代码,看看他们是如何做到的。
  • @Tomas Voracek - 如您所说,请发送链接/说明如何获取 BeginInvoke 和 EndInvoke 的源代码。
  • @Tomas,因为您似乎再次拒绝阅读细节。 “BeginInvoke”的来源到底在哪里?我找不到它了。 Windows Forms 与“BeginInvoke on delegates”无关,这正是我所要求的。我不是在谈论 Control.BeginInvoke。

标签: c# .net multithreading


【解决方案1】:

MSDN 说 BeginInvoke 是线程安全的:http://msdn.microsoft.com/en-us/library/0b1bf3y3.aspx

控件上有四种线程安全的方法:Invoke、 BeginInvoke、EndInvoke 和 CreateGraphics(如果 控件已创建

【讨论】:

  • 我相信问题作者不是在问Control.BeginInvoke,而是DelegateBeginInvokeEndInvoke
  • 是的,在这种情况下,我对 Control.BeginInvoke 不感兴趣,而是对代表的 Begin/EndInvoke 感兴趣。
【解决方案2】:

整个框架的源代码可从 Microsoft 获得,地址为 Reference Source Website

【讨论】:

  • BeginInvoke 和 EndInvoke 的源代码到底在哪里?我在 .net 3.5SP1 上,所以我查看了“.NET_3.5_sp1_redist”的来源——它们不在那里。就像 Marc Gravell 所说,它可能在运行时本身的源代码中,而不是在其上运行的 .net 库(我可以通过您的链接下载源代码)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-28
  • 2020-06-04
相关资源
最近更新 更多