创建线程函数
创建具有多个线程的应用程序可能具有挑战性。 如果您需要创建新线程以在后台完成任务(例如,使UI保持响应状态),那么您将发现需要将一些或全部cpu密集型例程移入它们自己的或至少独立的线程中。 本文不会深入探讨如何创建这些新线程,仅需说说您可以雇用背景工作人员来实现这一目标。
在许多情况下,您的例程可能需要更新UI,因此,您的应用程序将用以下方法摇摇晃晃的手指:
“跨线程操作无效:...”在进行诱人时,您确实应该避免
CheckforillegalCrossThreadCalls = True在您的窗体上,以强制您的程序忽略非法的跨线程调用。 这样做很可能会给您带来很多痛苦。 相反,我迷上了一个相对简单的策略。为了安全地从另一个线程更新UI
委托是必需的。 当我遇到这种需要时,我直接在将从UI线程外部调用的子或函数上方创建一个委托(例如,使用背景工作者)。 仅供参考 -您放入表单或直接从表单调用的所有代码都将在与UI相同的线程中运行-从而有可能减慢UI的速度。委托看起来像这样:
Private Delegate Sub del_MySub(MyArgument as MyType)
该委托将用于安全地封送跨线程的调用。
现在,在子(或函数)内部,我测试调用以查看是否有必要使用委托。 看起来像这样:
Private Sub MySub(MyArgument as MyType)
If MyUIControl.InvokeRequired Then
MyUIControl.Invoke(New del_MySub(AddressOf MySub), MyArgument)
Else
MyUIControl.Property = MyArgument
End if
End Sub
所以内联代码看起来像这样...
Private Delegate Sub del_MySub(MyArgument as MyType)
Private Sub MySub(MyArgument as MyType)
If MyUIControl.InvokeRequired Then
MyUIControl.Invoke(New del_MySub(AddressOf MySub), MyArgument)
Else
MyUIControl.Property = MyArgument
End if
End Sub
因此,实际上发生的是从另一个线程对子程序进行了初始调用,但是.invokerequired方法通过委托将调用封送回同一子程序(对.invokerequired的调用当然会返回false)。
然后在作业完成时展开。
翻译自: https://bytes.com/topic/visual-basic-net/insights/965373-strategy-creating-thread-safe-sub-function
创建线程函数