创建线程函数_创建线程安全子或函数的策略

本文介绍了一种在多线程应用中安全更新UI的方法,避免了跨线程操作导致的问题。通过使用委托,可以确保UI更新总是在主线程中执行,保持UI的响应性和稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

创建线程函数

创建具有多个线程的应用程序可能具有挑战性。 如果您需要创建新线程以在后台完成任务(例如,使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

创建线程函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值