我需要处理多个大的二维数组(例如1024 x 128),在代码的某个部分,我需要转置其中的一些数组(最多12个)。 这个过程需要相当长的时间,我正在尽可能地加快速度。由于VB.NET支持多线程,我阅读了不同的来源,并在主子程序中编写了以下代码:
RunXTransposingThreads(Arr1, Arr2, Arr3, ...)
使用BackgroundWorker
作为我的解决方案的一部分:
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, 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"。问题是:如果我还没有转置数组,如何停止主代码的执行?
Task.Run
、async/await
和IProgress<T>
所取代。使用Task.Run
轻松启动大量任务,并用Task.WhenAll(arrayOfTasks)
等待它们完成非常容易。另一方面,如果想要并行处理已经通过Parallel
方法提供的大量数据,比如Parallel.ForEach
和Parallel.For
。 - Panagiotis KanavosAsParallel
的意思了吗?C#代码也可以。 - Noldor130884