在创建窗口句柄之前,无法在控件上调用 VB.NET Invoke,但句柄已创建

2024-03-05

这是我的情况,有2个班级和我的主要表格Form1:

Class1:有一个方法 doSomethingAndCall(callback) ,它创建一个新线程 Class2:具有动态创建的控件,带有触发 Class1.doSomethingAndCall(newCallback) 的按钮

在代码中它看起来像这样(它从 Class2.Button_Click 开始):

Class Class1
  public shared sub doSomethingAndCallAsync(state as object)
    Console.WriteLine(Form1.InvokeRequired) 'output: false
    Console.WriteLine(Form1.IsHandleCreated) 'output: false
    Form1.Invoke(state.callback) 'throws System.InvalidOperationException
  end sub

  public shared sub doSomethingAndCall(callback as object)
    System.Threading.ThreadPool.QueueUserWorkItem(AddressOf doSomethingAndCallAsync, New With {.callback = callback})
  end sub
End Class

Class Class2
  Public Delegate Sub doSomethingDelegate()

  Public Sub doSomething()
    Console.WriteLine("success!")
  End Sub

  Public Sub Button_Click(ByVal sender As Object, ByVal e As System.EventArgs)
    Class1.doSomethingAndCall(New doSomethingDelegate(AddressOf doSomething))
  End Sub
End Class

我得到的确切异常是:

在创建窗口句柄之前,无法在控件上调用 Invoke 或 BeginInvoke

正如我所看到的,第 4 行中的 console.WriteLine 表明该表单实际上并未创建。所以我添加了这个处理程序,现在它变得非常混乱:

 Private Sub Form1_HandleCreated(sender As Object, e As System.EventArgs) Handles Me.HandleCreated
        Console.WriteLine("Handle created") 'Output: Handle created, when running program
  End Sub

  Private Sub Form1_HandleDestroyed(sender As Object, e As System.EventArgs) Handles Me.HandleDestroyed
        Console.WriteLine("Handle destroyed") 'Will never Output!
  End Sub

所以它被创建并且从未被销毁,但是如果我单击按钮它仍然不可用? -任何人都可以解释一下发生了什么事以及如何正确调用回调,谢谢!


的实例My.Forms.Form1 aka. Form1每个线程都会有所不同。您需要正确实例的句柄。将按钮拖放到您的Form1并添加以下代码:

Public Class Form1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Threading.Tasks.Task.Factory.StartNew(Sub() Class1.Wrong())
        Threading.Tasks.Task.Factory.StartNew(Sub() Class1.Correct(Me))
    End Sub

End Class

Public Class Class1

    Public Shared Sub Wrong()
        Debug.WriteLine(String.Format("(Other thread, wrong) InvokeRequired={0}, IsHandleCreated={1}", Form1.InvokeRequired, Form1.IsHandleCreated))
    End Sub

    Public Shared Sub Correct(instance As Form1)
        Debug.WriteLine(String.Format("(Other thread, correct) InvokeRequired={0}, IsHandleCreated={1}", instance.InvokeRequired, instance.IsHandleCreated))
    End Sub

End Class

Output

(其他线程,正确)InvokeRequired=True,IsHandleCreated=True

(其他线程,错误)InvokeRequired=False,IsHandleCreated=False

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

在创建窗口句柄之前,无法在控件上调用 VB.NET Invoke,但句柄已创建 的相关文章

  • 为什么有些控件同时具有BackgroundImage和Image属性?

    为什么有些控件喜欢Button or PictureBox两者都有BackgroundImage and Image财产 为什么在按钮的情况下需要它们两个 或者为什么在图片框中背景图像应该可用 BackgroundImage继承自Contr
  • 使用单独的线程在java中读取和写入文件

    我创建了两个线程并修改了 run 函数 以便一个线程读取一行 另一个线程将同一行写入新文件 这种情况会发生直到整个文件被复制为止 我遇到的问题是 即使我使用变量来控制线程一一执行 但线程的执行仍然不均匀 即一个线程执行多次 然后控制权转移
  • 如何在Spring-Boot中创建DefaultMessageListenerContainer?

    我是 Spring Boot 的新手 并尝试创建 DefaultMessageListenerContainer 以便我可以使用 weblogic workmanager 并以多线程方式运行多个消息侦听器 有人可以提供一些例子吗 到目前为止
  • 即使 keypreview = true,按钮也会阻止 KeyDown 事件触发

    在 VS Express 12 中重现的步骤 创建一个新的 Windows 窗体应用程序项目 添加按钮 将 Form KeyPreview 设置为 true 向表单添加 keyDown 事件 只要按钮存在于表单上 事件就不会触发 我有一个项
  • 在 Visual Basic 中将窗体放置在屏幕右下角

    当表单加载时 如何将表单定位在屏幕的右下角 我正在使用 Visual Basic 2010 Express Thanks 编辑 我这样做了 看起来效果很好 Dim x As Integer Dim y As Integer x Screen
  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • 组合框项目为空但数据源已满

    将列表绑定到组合框后 其 dataSource Count 为 5 但组合框项目计数为 0 怎么会这样 我习惯了 Web 编程 而且这是在 Windows 窗体中进行的 所以不行combo DataBind 方法存在 这里的问题是 我试图以
  • 没有为 1 个或多个必需参数给出值。更新SQL

    我正在编写一个程序 当用户在列表视图上选择记录时 该程序会更新密码或积分 我收到错误 没有为 1 个或多个必需参数给出值 我不知道如何纠正 我是否遗漏了一些明显的东西 Dim sql As String UPDATE Users SET P
  • 如何重新启动死线程? [复制]

    这个问题在这里已经有答案了 有哪些不同的可能性可以带来死线程回到可运行状态 如果您查看线程生命周期图像 就会发现一旦线程终止 您就无法返回到新位置 So 没有办法将死线程恢复到可运行状态 相反 您应该创建一个新的 Thread 实例
  • 赋值运算符“=”是原子的吗?

    我正在使用全局变量实现线程间通信 global var volatile bool is true true thread 1 void thread 1 while 1 int rint rand 10 if is true cout l
  • 从 Form2 访问 Form1 控件

    有两个表单 Form1和Form2 Form1有一个按钮 btnNew 单击时打开Form2 并且被禁用 我需要再次启用该按钮 只有当Form2关闭时 用户也需要同时使用Form1 这段代码不再启用该按钮 我哪里失踪了 在表格1中 priv
  • 检查 DBNull 会引发 StrongTypingException

    我正在使用数据集从数据库中提取数据 一行中的一个字段是NULL 我知道这个 但是 以下 vb net 代码会抛出StrongTypingException 在数据集设计器中自动生成的 get SomeField 方法中 If Not IsD
  • 如何在列表框项目之间画一条线

    我希望能够用水平线分隔列表框中的每个项目 这只是我用于绘制项目的一些代码 private void symptomsList DrawItem object sender System Windows Forms DrawItemEvent
  • 从库中捕获主线程 SynchronizationContext 或 Dispatcher

    我有一个 C 库 希望能够将工作发送 发布到 主 ui 线程 如果存在 该库可供以下人员使用 一个winforms应用程序 本机应用程序 带 UI 控制台应用程序 没有 UI 在库中 我想在初始化期间捕获一些东西 Synchronizati
  • 为什么 gcc 链接时没有 lpthread 标志?

    我当时正在做一个业余爱好项目 其中互斥体的行为很神秘 我将其归结为这个显然应该陷入僵局的测试用例 include
  • 插入具有只读主键列的表

    我正在使用一个使用 sql server 数据库的应用程序 我试图在表中插入一行 如下所示 该表有一个主键 prodNum 这是自动生成的密钥 当我尝试向表中插入一行时 如下所示 在行中intResult oSglProdTableAdap
  • 设置国际货币格式

    我有一个 asp net 应用程序 我们正在 全球化 过程中 我将 currentculture 和 currentUICultre 设置为适当的值 并且货币按预期使用货币格式显示 即 FormatCurrency nPrice 产生 en
  • 使用 Graphics.FromHwnd 在屏幕上绘图和清除

    我正在尝试创建一个程序 它获取光标下窗口的句柄 显示有关它的一些数据 并在整个窗口的顶部绘制一个填充矩形 具有非常低的阿尔法 我正在使用 C 和 winforms 我已经成功地做到了这一点 但问题是我的绘制方法位于BackgroundWor
  • 当我在组合框中选择一个项目时,如何防止 TextChanged 事件?

    我有一个TextChanged http msdn microsoft com en us library system windows forms control textchanged aspx我的事件ComboBox http msd
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret

随机推荐

  • 如何在javascript中选择包含特定字符串的所有id标签?

    我有一个 ASP NET 应用程序 它可以呈现多个问题 并可以选择对给出的答案提供解释
  • AWS Lambda 公有子网 EIP 提供互联网访问

    在抱怨允许附加到 VPC 的 lambda 函数访问互联网的 NAT 网关成本时 我发现了一些关于在公共子网而不是私有子网中部署 lambda 并将 EIP 附加到由 Lambda 创建的 ENI 的建议 我也有一个连接到 VPC 的 IG
  • 如何根据表单输入值从谷歌表单获取到不同文件夹的新响应

    我有一张包含问题的表格 提单号 进口商代码 上传文件 每个用户提交回答时 文件应保存在不同的文件夹中 文件夹名称应为问题 BL编号 的输入值 我们怎样才能使它成为可能 这在很大程度上取决于您的表单的外观 这是一个如何完成的示例 假设您有一个
  • 场景大纲的设置和拆卸 (cucumber-jvm)

    我在代码中使用场景大纲 并希望在场景大纲开始之前执行一些代码 并在场景大纲执行完成后执行一些代码 我知道黄瓜中有 Before 和 After 注释 但这些注释会在每个场景之前和之后执行 因此 如果我有一个场景大纲和 3 行示例数据 那么
  • 如何在 JavaFX 中围绕自定义枢轴旋转对象?

    我想围绕自定义枢轴旋转一个对象 这就是它的重点 所以我有这样的代码 private final EventHandler
  • 根据字段值更改奏鸣曲管理包中的行颜色

    我有奏鸣曲管理包 但无法弄清楚如何根据表单模板中的字段值更改样式 例如字段难度 难度值越高 记录行的颜色应该越红 我怎样才能做到这一点 我花了几个小时来理解奏鸣曲中的树枝模板 但是我读这个模板越多 我就越感到困惑 模板之间存在块调用 并且不
  • 通过元编程将c++简化为objective-c/cocoa桥接?

    在纯 C 世界中 我们可以结合使用基于模板的编译时和运行时技术 在编译时生成不同组件或接口之间的接口或粘合代码 例如 大多数情况下自动编组到使用旧类型的调用 从调用中编组 然而 当必须将 C 应用程序与 Objective C Cocoa
  • Envers:单向 OneToMany 无需额外审核表?

    以下数据库架构 员工 EMP ID PK 姓名 工资 电话 ID PK number str OWNER ID FK Employee aud EMP ID PK REV PK FK REVTYPE 姓名 工资 Phone aud ID P
  • easyphp 和 .htaccess

    我需要 EasyPHP 和 htaccess 的帮助 htaccess 文件不起作用 我认为这是因为我没有使用 EasyPHP 设置某些内容 我的 EasyPHP 版本是5 3 8 1 也许有人知道如何解决这个问题 htaccess 文件
  • 从另一个 cython 包的 cdef 类内联 cdef 方法

    我有一个 cython 类 如下所示 cdef class Cls cdef func1 self pass 如果我在另一个库中使用此类 我是否能够内联 func1 这是一个类方法 或者我应该找到解决方法 例如 通过创建一个将 Cls 指针
  • Flutter中间隔自动获取Api数据

    在我的扑动应用程序中 我试图显示更新数据 我成功地手动从天气 api 获取数据 但我需要不断地每5秒抓取一次数据 所以应该会自动更新 这是我在 Flutter 中的代码 class MyApp extends StatelessWidget
  • R中系统投资利息计算的代码[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 假设我每月在银行存入 1000 P 美元 为期 60 n 个月 银行每月向我支付 1 利率 作为利息 因此我可以计算每笔存款的利息 P 1
  • macOS:是否可以检测何时按下 Mac 键盘上的“fn”键?

    我很好奇是否可以检测何时按下 Mac 键盘上的 fn 键 无论是单独使用还是与另一个键组合使用 有没有办法做到这一点 我愿意使用任何类型的方法 包括必要时未记录的 Apple API 当按下 Fn 键时 所有键盘 NSEvents 的 mo
  • python 列出数字

    我需要在 python 中打印所有数字列表 到目前为止我写了这个 def lists listNum i if i len listNum 1 print listNum else for j in range i len listNum
  • 检测不同浏览器下安装的插件?

    我想知道是否有一种方法可以检测不同浏览器上安装的插件 到目前为止 我发现您可以通过尝试猜测 chrome path to some plugin image gif 是否存在来 检测 Firefox 上的插件 Firefox 的代码如下所示
  • web.config 中的表单身份验证

    我正在使用 MVC3 并将用户身份验证放在 web config 文件中 这是为了绕过 sqlserver 身份验证 web config中的代码如下
  • 如何在过程宏中确定编译属性?

    我正在开发一个程序宏 它做了很多工作 可以大大减慢编译速度 所做的工作不会影响函数的语义 也就是说 如果给定相同的参数集 则返回值不会根据是否应用宏而改变 为了使编辑 比较 测试循环更快 我想根据与包的编译方式相关的条件使宏成为无操作 我希
  • setReadOnly 不起作用

    我在用setReadOnly方法使我的应用程序目录存储在我的 SD 卡上 只读 然而 即使我为应用程序提供了以下内容 调用此方法时也会返回 false android permission WRITE EXTERNAL STORAGE清单中
  • Laravel 5 Eloquent,如何动态设置强制转换属性

    在 laravel 5 1 中 有一个名为 Attribute Casting 的新功能 详细记录在此处 http laravel com docs 5 1 eloquent mutators attribute casting http
  • 在创建窗口句柄之前,无法在控件上调用 VB.NET Invoke,但句柄已创建

    这是我的情况 有2个班级和我的主要表格Form1 Class1 有一个方法 doSomethingAndCall callback 它创建一个新线程 Class2 具有动态创建的控件 带有触发 Class1 doSomethingAndCa