一例基于vb.net的跨线程访问winform组件的Parallel并发程序脚本

开发环境:vs2019

目的:测试Parallel.For并发方法

途径:在richtextbox控件中打印从1到11

观察到的现象:1到11并未按照顺序输出,因为并发操作可以并驾齐驱的执行多个任务但却并不能保证按照顺序执行

代码中用到了委托,因为并发执行打印数字的线程和渲染窗体程序的线程并非同一线程

  • 先声明打印的原型函数
Public Sub shownumbers(ByVal i As Integer)
        RichTextBox2.Text += i.ToString() + vbCrLf
End Sub
  • 声明原型函数的委托类型----要确保参数个数和类型与原型函数一致
Dim Delegate Sub delegatetowrite(ByVal i As Integer)
  • 把原型函数注册到委托函数中
Dim startwrite As delegatetowrite = New delegatetowrite(AddressOf shownumbers)

 

  • 定义一个Action函数(在vs2019的版本中vb.net的Parallel.For()有11个版本,其中一型的函数是  Public Shared Function [For](fromInclusive As Integer, toExclusive As Integer, body As Action(Of Integer)) As ParallelLoopResult)

与此例的上级要求十分吻合,因此选用

Dim myaction As Action(Of Integer) = New Action(Of Integer)(
            Sub(ByVal i As Integer)
                RichTextBox2.Invoke(startwrite, i)
            End Sub
)
  • 调用Parallel.For函数
Parallel.For(1, 11, Sub(i)
           myaction(i)
End Sub)

 完整的代码上下文

Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        'MessageBox.Show(shownum().ToString())
        Dim watch As New Stopwatch()
        Dim Delegate Sub delegatetowrite(ByVal i As Integer)
        Dim startwrite As delegatetowrite = New delegatetowrite(AddressOf shownumbers) 

Dim myaction As Action(Of Integer) = New Action(Of Integer)(
Sub(ByVal i As Integer)
RichTextBox2.Invoke(startwrite, i)
End Sub )
watch.Start()
Parallel.For(
1, 11, Sub(i)
              myaction(i)
End Sub)
watch.Stop()
MessageBox.Show(watch.Elapsed.ToString())
End Sub

Public Sub shownumbers(ByVal i As Integer)
RichTextBox2.Text
+= i.ToString() + vbCrLf
End Sub

执行效果

 

更新后记:时光如白驹过隙,提交文章后的6年的今天又碰到此类问题,怎料最关键的步骤“声明原型函数的委托类型”居然贴错了代码,这个错误竟延续多年未曾更正,令人扼腕!

posted @ 2020-08-10 19:31  saintdingtheGreat  阅读(351)  评论(0)    收藏  举报