【问题标题】:Using Invoke Method in an IF statement vb.net在 IF 语句中使用调用方法 vb.net
【发布时间】:2021-06-20 17:31:52
【问题描述】:

我正在使用 TCP 客户端/服务器从微控制器接收信息,并在 Win Forms 应用程序 VB.NET 中使用该信息。我的问题是尝试根据 IF 语句中的数据表检查标签。我尝试了不同形式的调用,但它们似乎都不起作用。 VB代码

If lblStep.Invoke(New MethodInvoker(Sub() lblStep.Text = lblStep.Text), Nothing) = dt.Rows(0).Item("Step") Then
'Do something
end if

我收到的错误是多线程错误。

【问题讨论】:

  • 使用表单作为编组器,并在尝试读取其属性之前检查是否创建了所需的控件句柄。这应该设置什么:lblStep.Text = lblStep.Text?请注意,If 条件需要在方法内部而不是外部进行测试。
  • 您是否尝试评估控件的文本是否包含 something 并根据测试结果设置单元格的值?测试一个Control的文本是否和一个Cell的内容一样,然后做something else? -- 如果你还没有设置Option Strict On
  • @Jimi 我正在尝试评估标签的文本是否等于数据表单元格的值。控件的句柄是在读取其属性之前创建的。
  • 该代码是荒谬的。您在 UI 线程上做的唯一一件事就是将 TextLabel 分配给它自己。您似乎期望Invoke 返回一个值,然后您可以将其与某些东西进行比较,但是如果Invoke 调用Sub,它应该如何返回任何东西?如果您期望返回值,那么您必须调用一个返回值的方法,即Function。当然,调用一个方法来获取返回值,然后在该方法中进行比较时,有什么意义呢?

标签: vb.net multithreading if-statement label invoke


【解决方案1】:

如果你希望得到一个返回值,那么你需要调用一个返回值的方法,这意味着一个函数。你可以这样做:

If CStr(lblStep.Invoke(Function() lblStep.Text)) = dt.Rows(0).Field(Of String)("Step") Then

或者这个:

If CBool(lblStep.Invoke(Function() lblStep.Text = dt.Rows(0).Field(Of String)("Step"))) Then

第一个从 UI 线程获取String 并在后台线程上执行比较,而第二个在 UI 线程上执行比较。

请注意,我还确保所有内容都是正确的数据类型,如果您设置了Option Strict On,则需要这样做,您绝对应该这样做。

【讨论】:

    猜你喜欢
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-01
    • 1970-01-01
    相关资源
    最近更新 更多