vb.net的委托调用

这篇博客介绍了VB.NET中如何正确地在多线程环境下更新UI。通过创建自定义委托和使用Invoke方法,避免了跨线程操作Windows窗体控件时出现的错误。示例代码演示了错误的直接修改UI控件和正确的委托调用方法。
 vb.net编程如果用多线程,因为无法传递函数指针,所以就存在了委托调用从而实现获得函数指针的作用:
在VB.NET中,一个委派是一个类型安全、面向对象的函数指针。

委托调用编程如下:


 '定义一个发送端‘更新进度条’的委托
    Public Delegate Sub UpdateSendCallBack(ByVal msg As String, ByVal SendNum As Integer)


 '发送端‘更新进度条’
    Public Sub UpdateSend(ByVal msg As String, ByVal SendNum As Integer)
        If  frmmainsl.ProgressBar1.InvokeRequired Then


            Dim d As New UpdateSendCallBack(AddressOf UpdateSend)
            frmmainsl.Invoke(d, New Object() {msg, SendNum})
        Else


            Me.Label3.Text = msg
            Me.ProgressBar1.Value = SendNum
        End If


总结:delegate声明一个委托——定义委托调用的函数。(委托和函数的参数要一致)


这样在其他线程中要实现更新季度条时要这样写:    frmmainsl.UpdateSend("第" & PacketNum + 1 & "包传送结束!", PacketNum + 1)




正规写法:


定义一个发送端‘更新进度条’的委托
    Public Delegate Sub UpdateSendCallBack(ByVal msg As String, ByVal SendNum As Integer)


   '发送端‘更新进度条’
     Private Sub UpdateSend(ByVal msg As String, ByVal SendNum As Integer)
                 Me.Label3.Text = msg
                  Me.ProgressBar1.Value = SendNum
      End If


这样在其他线程中要实现更新季度条时要这样写:       frmmainsl.Invoke(New UpdateSendCallBack(AddressOf UpdateSend), New Object() {"第" & PacketNum + 1 & "包传送结束!", PacketNum + 1})       




'=============================================================下面是转载========================================


[原帖地址]http://topic.csdn.net/u/20111019/17/ac098c48-ed25-4e1f-acd0-ec192ca44eac.html

  1. '原先错误的写法!  
  2. -------------------------  
  3. Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click  
  4.     Dim MyThread As New System.Threading.Thread(AddressOf sum)  
  5.     MyThread.Start()  
  6. End Sub  
  7. Private Sub sum()  
  8.     Dim i, sum As Integer  
  9.     For i = 0 To 100  
  10.         sum += i  
  11.     Next  
  12.     Me.Text = CStr(sum)  '在这里就会报错,教我"如何跨线程调用windows窗体控件",表示没看懂  
  13. End Sub  
  14. -------------------------------------  
  15. '正确的线程委托写法  
  16. -------------------------------------  
  17. Private Delegate Sub myDelegate(ByVal myString As String'自定义一个委托  
  18.   
  19. Private Sub SetWindowText(ByVal myString As String'与委托相同签名的函数或过程  
  20. Me.Text = myString  
  21. End Sub  
  22.   
  23. Private Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click  
  24. Dim MyThread As New System.Threading.Thread(AddressOf sum)  
  25. MyThread.Start()  
  26. End Sub  
  27.   
  28. Private Sub sum()  
  29. Dim i, sum As Integer  
  30. For i = 0 To 100  
  31. sum += i  
  32. Next  
  33. Me.Invoke(New myDelegate(AddressOf SetWindowText), sum.ToString) '委托的调用  
  34. End Sub  

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值