其他线程主线程上的Fire方法

时间:2016-10-20 11:11:14

标签: vb.net multithreading

问题

我在我的应用程序中使用多线程,它的工作方式是我有一个包含22个字符串的数组,代表一些文件名:

Public ThreadList As String() = {"FSANO1P", "FJBJB1P", "COPOR1P", "FFBIVDP", "FFCHLDP", "FFDBKDP", "FFDREQP", "FFINVHP", "FFJMNEP", "FFPIVHP", "FFUNTTP", "FJBJM1P", "FJBJM2P", "FJBNT2P", "FPPBE9P", "FTPCP1P", "FTTEO1P", "FTTRQ1P", "FJBJU1P", "FTTEG1P", "FFJACPP", "XATXTDP"}

然后我遍历数组并为每个文件创建一个新线程:

For Each mThreadName As String In ThreadList                            
    Dim mFileImportThread = New FileImportThreadHandling(mThreadName, mImportGuid, mImportDate, Directory_Location, mCurrentProcessingDate, mRegion)
Next

所以在新线程'FileImportThreadHandling'中,它将通过启动一个新线程来调用方法:

mThread = New Thread(AddressOf DoWork)
mThread.Name = "FileImportThreadHandling"
mThread.Start()

然后在“DoWork”中,它将确定当前有问题的文件,并运行与该文件相关的代码。

代码运行后,我想将此报告回主线程。请有人给我一个解决方案。

3 个答案:

答案 0 :(得分:0)

您需要使用Delegates

修改

看一下这个片段:

Sub Main()
    mThread = New Thread(AddressOf doWork)
    mThread.Name = "FileImportThreadHandling"
    mThread.Start()
End Sub


Sub doWork()
    'do a lot of hard work
    workDone(result)
End Sub


Delegate Sub workDoneDelegate(result As Integer)
Sub workDone(abilita As Boolean, Optional src As Control = Nothing)
    If Me.InvokeRequired Then
        Me.Invoke(New workDoneDelegate(AddressOf workDone), {result})
    Else
        'here you're on the main thread
    End If
End Sub

答案 1 :(得分:0)

这是一个可能会给你一些想法的例子。注意使用Async和Task。您需要一个带有两个按钮和一个标签的表单。

{{1}}

答案 2 :(得分:0)

使用操作和回调来跟踪剩余的操作。 (为我的例子简化了你的课程)

Public ThreadList As String() = {"FSANO1P", "FJBJB1P", "COPOR1P", "FFBIVDP", "FFCHLDP"}
Private actionCounter As Integer = 0
Private lockActionCounter As New Object()

Sub Main()
    Console.WriteLine("Starting...")
    For Each mThreadName As String In ThreadList
        Dim mFileImportThread = New FileImportThreadHandling(mThreadName)
        actionCounter += 1
        Call New Action(AddressOf mFileImportThread.DoWork).
            BeginInvoke(AddressOf callback, mThreadName)
    Next
    Console.Read()
End Sub

Private Sub callback(name As IAsyncResult)
    Dim remainingCount As Integer
    SyncLock lockActionCounter
        actionCounter -= 1
        remainingCount = actionCounter
    End SyncLock
    Console.WriteLine("Finished {0}, {1} remaining", name.AsyncState, actionCounter)
    If remainingCount = 0 Then Console.WriteLine("All done")
End Sub

Private Class FileImportThreadHandling
    Shared r = New Random()
    Private _name As String
    Public Sub New(name As String)
        _name = name
    End Sub
    Public Sub DoWork()
        Dim delayTime = (r).Next(500, 5000)
        Console.WriteLine("Doing {0} for {1:0}ms.", _name, delayTime)
        Thread.Sleep(delayTime)
    End Sub
End Class