总是使用Form.Invoke()是一种不好的做法吗?

3

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

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 真的有必要吗?


1
为什么要缓存Handle?有时它可以被重新创建。只需将窗体引用存储为适当的只读属性即可。 - H H
我不知道这一点。谢谢您。在什么情况下会重新创建它? - gunakkoc
不知道列表,但可能是在设置某些属性(边框、MDIxxx等)时。但HandleCreated将会触发,所以您的代码是安全的。只是不必要地复杂。 - H H
C# 不支持 DirectCast 等操作。我出于充分的理由已经移除了该标签。 - H H
重点不在于DirectCast。我认为任何对.NET和线程有深入了解的人都可以回答这个问题。此外,我想任何了解C#的人都能理解这种简单的VB代码。 - gunakkoc
标签是关于内容的,而不是关于期望的受众。 - H H
1个回答

6
你只需要在多线程时需要将更新传回UI线程的位置检查InvokeRequired
我认为,到处使用它可能不是一个好主意,因为你应该定义和了解你的线程模型,因此知道线程边界和需要此检查的点。
如果你无处不洒,基本上就是在说“我不知道这是否只会被UI线程调用”,并且(假设你实际上确实有多个线程)当你发现你错过了一点或其他非线程安全代码被执行时,这将导致调试痛苦。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接