【问题标题】:Is always using Form.Invoke() a bad practice?总是使用 Form.Invoke() 是一种不好的做法吗?
【发布时间】:2013-01-25 08:35:37
【问题描述】:

我知道,这可能是一个非常简单的问题,但我不能确定。我在一个模块中有这个:

Public theHandle As IntPtr

这在我的名为 Form1 的主窗体中:

Private Sub Form1_HandleCreated(sender As Object, e As System.EventArgs) Handles Me.HandleCreated
    theHandle = Me.Handle
End Sub

我有许多其他类、模块和线程,并且没有使用InvokeRequired,我使用它来从任何地方调用委托。我的意思是来自其他线程、类、模块等。

DirectCast(Form1.FromHandle(theHandle), Form1).Invoke(D_Calculate)

代替:

D_Calculate.Invoke()

这是一种不好的做法吗?真的有每次检查InvokeRequired 的目的吗?

【问题讨论】:

  • 为什么要缓存句柄?有时可以重新创建它。只需存储表单引用。作为一个适当的只读属性。
  • 我不知道。谢谢你。在什么情况下会重新创建?
  • 不知道该列表,但可能在设置某些属性(Border、MDIxxx、...)时出现。但是 HandleCrerated 会触发,所以你的代码是安全的。只是不必要的复杂。
  • C# 不做 DirectCast 等。我出于充分的理由删除了该标签。
  • 重点不是 DirectCast。我认为任何对 .NET 和线程有深入了解的人都可以回答这个问题。我猜任何了解 C# 的人都可以理解这种简单的 VB 代码。

标签: .net vb.net winforms delegates invokerequired


【解决方案1】:

你只需要检查InvokeRequired你是多线程的并且需要将更新编组回UI线程。

我认为在任何地方都使用它可能不是一个好主意,因为您应该定义和理解您的线程模型,因此准确地了解线程边界在哪里以及需要检查的点。

如果你在任何地方随意使用它们,你基本上是在说“我不知道这是否只会由 UI 线程调用”并且(假设你实际上确实有多个线程)将导致调试世界当你发现你错过了一个点或者其他非线程安全的代码被执行时会很痛苦。

【讨论】:

    猜你喜欢
    • 2018-10-03
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    相关资源
    最近更新 更多