WithEvents(句柄)与 AddHandler 之间的区别

2024-06-18

我搜索了关键字使用的差异Handles http://msdn.microsoft.com/en-us/library/6k46st1y.aspx代替添加处理程序 http://msdn.microsoft.com/en-us/library/7taxzxka.aspx, in VB.NET http://en.wikipedia.org/wiki/Visual_Basic_.NET,但我无法解释为什么这段代码不起作用..

Imports System.Threading
Public Class MyClass_EventArgs
    Inherits System.EventArgs
End Class

Public Class MyClass
    Public Event MainThreadFinished(ByVal sender As Object, ByVal e As MyClass_EventArgs)
    Private WithEvents MyEvents As MyClass
    Private trd As Thread
    Public Sub New()
        'AddHandler MainThreadFinished, AddressOf Me.MyEvents_ThreadFinished
        trd = New Thread(AddressOf mainThread)
        trd.IsBackground = True
        trd.Start()
        RaiseEvent MainThreadFinished(Me, Nothing)
    End Sub
    Protected Overrides Sub Finalize()
        trd.Abort()
    End Sub
    Protected Sub MyEvents_ThreadFinished(ByVal sender As Object, ByVal e As MyClass_EventArgs) _
                Handles MyEvents.MainThreadFinished
        MessageBox.Show("AAA")
    End Sub
    Private Sub mainThread()
        RaiseEvent MainThreadFinished(Me, Nothing)
    End Sub
End Class

好吧,这段代码永远不会响应事件,但是如果我取消注释以下行,代码就会工作并出现消息框......

'AddHandler MainThreadFinished, AddressOf Me.MyEvents_ThreadFinished

为什么会出现这种情况?


看起来你有了一个很好的发现!根据微软文档,RaiseEvent 语句 http://msdn.microsoft.com/en-us/library/fwd3bwed%28v=vs.100%29.aspx,

非共享事件不应在构造函数中引发 声明它们的类。虽然此类事件不会导致 运行时错误,它们可能无法被关联事件捕获 处理程序。使用Shared如果需要,修饰符可创建共享事件 从构造函数引发事件。

换句话说,微软说你不应该做你正在做的事情——如果必须的话,不要使用共享事件。

在查看其他来源时,我会说之间的区别AddHandler and Handles是一个语法糖的问题。您可能想研究一下 C# 中的事件是如何完成的以获得更多见解(例如C# 事件 http://www.c-sharpcorner.com/uploadfile/dhananjaycoder/C-Sharp-events/). Handles与一起使用WithEvents作为类实例自动订阅事件的一种方式(否则显式完成+=在 C# 中和AddHander在 VB.NET 中)。

看来你的明确AddHandler确保事件连接在事件发生之前就位RaiseEvent,然后它就按照你想要的方式工作了。我只能猜测,如果没有这个,那些事件连接还没有完成 - 也就是说,它不起作用,因为编译器通过编译器编写者的任何设计模式在幕后插入执行相当于 AddHandler 的代码视为适当。考虑到对此的警告,设计者似乎很清楚这种可能的后果。

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

WithEvents(句柄)与 AddHandler 之间的区别 的相关文章

  • 在 String.Format 中插入格式化字符?

    我用谷歌搜索了这个 但 VB Net 2008 似乎不允许在 String Format 中插入格式化字符 例如 t r n BAD MessageBox Show String Format 0 tab 1 Foo Bar BAD Mes
  • 如何在vb.net中实现事务方式?

    我使用 VB net 200 开发一个连接到 MS Access 数据库的应用程序 我使用 TableAdapter 和 Dataset 连接到 Access DB 文件 我需要实现一个简单的事务方法 提交 回滚 来保存到数据库 有没有一种
  • Newtonsoft.Json.JsonReaderException

    我的 Newtonsoft Json 有问题 我正在尝试从 URL 解析 JSON 但收到错误 这是 JSON ID 0 Nome we Data 2013 09 16 Orario 00 00 16 Prestazione dfg Sta
  • WithEvents(句柄)与 AddHandler 之间的区别

    我搜索了关键字使用的差异Handles http msdn microsoft com en us library 6k46st1y aspx代替添加处理程序 http msdn microsoft com en us library 7t
  • 如何将 Datagridview 中的格式列更改为该值的日期类型

    例如 我有这样的值 41607 2069444444 41607 2068402778 41607 2072222222 这是来自 CDR 的 dateTimeOrigination 计算 在 Excel 中 我将格式单元格更改为日期类型
  • 如何使用 vb.net 将数据插入 Access 表?

    我想在 Access 数据库中插入一个新行 我正在考虑做类似的事情 oConnection new Connection connectionstring oTable oCennection table Orders oRow oTabl
  • 确定最接近的已知颜色

    我允许我的应用程序的用户选择自定义颜色 并希望有一种方法来显示每种颜色的友好名称 而不是显示十六进制代码的文本表示形式 我如何找到最近的System Drawing Color对于给定的十六进制代码 希望这对某人有帮助 Public Fun
  • 在 VB.NET 中将类标记为静态

    正如刚刚在最近的一篇文章中所说question https stackoverflow com questions 135759 why cant i inherit iodirectory and answer https stackov
  • 为什么 DragHandler exportAsDrag 禁用我的 MouseMotionListener?

    我想实现一个简单的 JComponent 拖放 并带有 O Reilly Swing Hacks 的预览 我的问题是 如果 TransferHandler 启动 Drag MouseMotionListener 停止执行 mouseDrag
  • 对列表中的一系列整数求和

    假设我有一个这样的列表 List
  • 将 AddressOf 传递给 VB.NET 中的函数以使用 AddHandler

    我需要将一个函数的引用传递给 VB NET 中的另一个函数 如何才能做到这一点 我的函数需要在内部使用 AddHandler 为此我需要向它传递一个处理函数 我下面的代码显然不起作用 但它传达了我需要的想法 Public Function
  • jQuery 更改输入类型=“文件”的方法

    我试图 100 接受 jQuery 因为它简单而优雅的 API 但我遇到了 API 和直接 HTML 之间的不一致 我无法弄清楚 我有一个 AJAX 文件上传器脚本 可以正常运行 我想在每次文件输入值更改时运行该脚本 这是我的工作代码
  • 整数溢出 - 将 C# 转换为 VB.Net 代码

    从 C 到 VB Net 的代码转换出现问题 var x 5783615 var y 56811584 var t x y x y和t是整数 在 C 中 t 将为 15536 49728 在 VB Net 中 我会得到一个整数溢出异常 知道
  • 将 DataTable 的单列转换为 CSV

    使用 VB NET 将 DataTable 的单列转换为 CSV 的最简洁方法是什么 这些值是整数 所以我不需要担心字符转义或编码 转换为 CSV 是什么意思 如果你想生成一个以逗号分隔值的字符串 你可以使用 this tbl是你的数据表和
  • 我应该使用带有backbone.js的中央事件总线吗?

    我目前正在开发我的第一个backbone js 应用程序 事件的概念对我来说非常熟悉 但我不确定是否应该使用中央事件调度程序 一般来说 我看到这两种方法 直接将事件发布者和事件接收者连接在一起 我从这种方法开始 使用事件总线并将发布者和接收
  • VB.NET 中的 Excel 自动调整列

    我这里有我的 VB6 代码并且运行良好 For CLms 1 To 10 ws Columns CLms AutoFit lt Autofilt data on XL sheet Next CLms 我已经搜索了如何在 VB NET 中使
  • 将面板添加到 Datagridview

    我想将面板放入包含一组控件的列中 并将其放入 datagridview 中 我怎么能这么做呢 因为标准方法允许添加复选框 按钮 组合框等 但我找不到如何放置简单的面板 谢谢你的帮助 面板控件也继承自控件类 因此您可以像添加任何其他控件一样添
  • SSDT 单元测试:从配置文件读取 SQL Server 单元测试设置时发生错误

    我在 Visual Studio 2013 professional 中创建了一个数据库项目 然后通过右键单击存储过程之一并选择来添加单元测试创建单元测试 选择创建一个新的VB测试项目 然后右键单击新创建的测试项目并选择SQL Server
  • 通过 Scriptaculous 拖放防止 JavaScript 点击事件

    我的页面上有一些可拖动的元素 这些相同的元素有一个导航到另一个页面的点击事件 我试图确定在用户拖动时防止触发单击事件的最佳方法 但如果不拖动则仍然允许单击事件 有人对实现这一目标的最佳方法有任何想法吗 我通过使用类似以下内容解决了这个问题
  • 将事件处理程序分配给带括号和不带括号的方法之间的区别

    假设您有以下内容 function doStuff code 2 种说法有什么区别 window onload doStuff window onload doStuff 两个语句都立即调用该方法 但如果我使用第一个语句 我可以将 onlo

随机推荐