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

the*_*eGD 3 .net vb.net delegates invokerequired winforms

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

Public theHandle As IntPtr
Run Code Online (Sandbox Code Playgroud)

这在我的主要形式名为Form1:

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

我有许多其他类,模块和线程,没有使用InvokeRequired,我使用它来从任何地方调用代理.我的意思是来自其他线程,类,模块等.

DirectCast(Form1.FromHandle(theHandle), Form1).Invoke(D_Calculate)
Run Code Online (Sandbox Code Playgroud)

代替:

D_Calculate.Invoke()
Run Code Online (Sandbox Code Playgroud)

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

Pao*_*olo 6

您只需要检查InvokeRequired多线程的位置,并且需要将更新编组回UI线程.

我认为,用它无处不在,可能不是一个好主意,因为你应该定义和理解你的线程模型,因此知道究竟哪里线程边界和需要此检查点.

如果你在任何地方自由地喋喋不休,你基本上都说"我不知道这是否只会被UI线程调用"和(假设你确实有多个线程)会导致一个调试痛苦的世界当你发现你错过了一个点或其他非线程安全代码被执行的结果.

  • +1用于"定义和理解您的线程模型". (3认同)