vb.net – 等待多个BackgroundWorkers完成
发布时间:2020-12-17 00:11:01 所属栏目:大数据 来源:网络整理
导读:我必须使用多个大的二维数组(例如1024 x 128),在我的代码的一部分中,我需要转置一些(最多12个). 该过程需要相当长的时间,我试图尽可能加快速度.知道VB.NET支持多线程我在这里和那里读了不同的源,并且可以在主子例程中提出以下代码: RunXTransposingThreads(
我必须使用多个大的二维数组(例如1024 x 128),在我的代码的一部分中,我需要转置一些(最多12个).
该过程需要相当长的时间,我试图尽可能加快速度.知道VB.NET支持多线程我在这里和那里读了不同的源,并且可以在主子例程中提出以下代码: RunXTransposingThreads(Arr1,Arr2,Arr3,...) 使用BackgroundWorkers作为我的解决方案的一部分: Private Sub RunXTransposingThreads(ParamArray ArraysToTranspose() As Array) Dim x = CInt(ArraysToTranspose.GetLength(0)) - 1 Dim i As Integer For i = 0 To x Dim worker As New System.ComponentModel.BackgroundWorker AddHandler worker.DoWork,AddressOf RunOneThread AddHandler worker.RunWorkerCompleted,AddressOf HandleThreadCompletion worker.RunWorkerAsync(ArraysToTranspose(i)) Next End Sub Private Sub RunOneThread(ByVal sender As System.Object,ByVal e As System.ComponentModel.DoWorkEventArgs) Dim Transposed(,) As Single = Array.CreateInstance(GetType(Single),0) ' I need this to be like that in order to use other functions later Transposed = Transpose2dArray(CType(e.Argument,Single(,))) e.Result = Transposed End Sub Private Sub HandleThreadCompletion(ByVal sender As Object,ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Debug.Print("Process complete") End Sub Function Transpose2dArray(Of Array)(ByVal inArray As Array(,)) As Array(,) Dim x = CInt(inArray.GetLength(1)) Dim y = CInt(inArray.GetLength(0)) Dim outArray(x - 1,y - 1) As Array For i = 0 To x - 1 For j = 0 To y - 1 outArray(i,j) = inArray(j,i) Next Next Transpose2dArray = outArray End Function 线程似乎有效,因为在执行RunXTransposingThreads后的某个时刻,我在屏幕上看到了一些“Process complete”.问题是:如果我还没有转置数组,如何停止执行main中的代码?
正如其他人所说,BackgroundWorker已经过时了.幸运的是,还有许多其他现代方法可以做到这一点.
因此,我不会向您展示使您的代码与BackgroundWorker一起使用的内容.相反,我会告诉你如何通过使用任务,这些现代方式之一来做同样的事情.希望能帮助到你. Function RunXTransposingTasks(ParamArray ArraysToTranspose() As Array) As Array Dim taskList = New List(Of Task(Of Single(,))) ' our tasks returns Arrays For Each arr In ArraysToTranspose Dim r = arr taskList.Add(Task.Run(Function() Transpose2dArray(r))) Next Task.WhenAll(taskList) ' wait for all tasks to complete. Return taskList.Select(Function(t) t.Result).ToArray() End Function Function Transpose2dArray(inArray As Array) As Single(,) Dim x = inArray.GetLength(1) - 1 Dim y = inArray.GetLength(0) - 1 Dim outArray(x,y) As Single For i = 0 To x For j = 0 To y outArray(i,i) Next Next Return outArray End Function ' Usage ' Dim result = RunXTransposingTasks(Arr1,...) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |