0

私は以下を含む関数を持っています

  WebUpdateThread = New System.Threading.Thread(AddressOf generatecids)
    WebUpdateThread.SetApartmentState(ApartmentState.STA)
    WebUpdateThread.Start()

    'after starting the thread i have some code that i want to run when the thread    finshes its work which takes about 3-4 hours
'if i put for example 
MsgBox("something")

スレッドが開始するとすぐにメッセージボックスが表示されますが、スレッドが終了するまで待機させるにはどうすればよいですか?

スレッドの状態をチェックするinfitinewhileループよりも十分なものはありますか?

4

3 に答える 3

3

BackGroundWorkerクラスを使用できます。これは、このシナリオ専用に設計されています。また、ProgressChangedイベントを使用して、ユーザーが何が起こっているのか不思議に思わないように、進行状況の表示を実装することもできます。

例:

Imports System.Threading
Imports System.ComponentModel


Public Class Form1
    Dim WebUpdateWorker As BackgroundWorker

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        WebUpdateWorker = New BackgroundWorker
        AddHandler WebUpdateWorker.DoWork, AddressOf DoWork
        AddHandler WebUpdateWorker.RunWorkerCompleted, AddressOf WorkFinished
        WebUpdateWorker.RunWorkerAsync()

    End Sub

    Public Sub generatecids()
        System.Threading.Thread.Sleep(20000)
    End Sub

    Private Sub DoWork(sender As Object, e As DoWorkEventArgs)
        generatecids()
    End Sub

    Private Sub WorkFinished(sender As Object, e As RunWorkerCompletedEventArgs)
        MsgBox("something")
    End Sub

End Class
于 2012-11-03T06:35:09.983 に答える
1
Please can try as below exapmle :
============================
Friend Class StateObj
   Friend StrArg As String
   Friend IntArg As Integer
   Friend RetVal As String
End Class

Sub ThreadPoolTest()
   Dim TPool As System.Threading.ThreadPool
   Dim StObj1 As New StateObj()
   Dim StObj2 As New StateObj()
   ' Set some fields that act like parameters in the state object.
   StObj1.IntArg = 10
   StObj1.StrArg = "Some string"
   StObj2.IntArg = 100
   StObj2.StrArg = "Some other string"
   ' Queue a task
   TPool.QueueUserWorkItem(New System.Threading.WaitCallback _
                          (AddressOf SomeOtherTask), StObj1)
   ' Queue another task
   TPool.QueueUserWorkItem(New System.Threading.WaitCallback _
                          (AddressOf AnotherTask), StObj2)
End Sub

Sub SomeOtherTask(ByVal StateObj As Object)
   ' Use the state object fields as arguments.
   Dim StObj As StateObj
   StObj = CType(StateObj, StateObj)   ' Cast to correct type.
   MsgBox("StrArg contains the string " & StObj.StrArg)
   MsgBox("IntArg contains the number " & CStr(StObj.IntArg))
   ' Use a field as a return value.
   StObj.RetVal = "Return Value from SomeOtherTask"
End Sub

Sub AnotherTask(ByVal StateObj As Object)
   ' Use the state object fields as arguments.
   ' The state object is passed as an Object.
   ' Casting it to its specific type makes it easier to use.
   Dim StObj As StateObj
   StObj = CType(StateObj, StateObj)
   MsgBox("StrArg contains the String " & StObj.StrArg)
   MsgBox("IntArg contains the number " & CStr(StObj.IntArg))
   ' Use a field as a return value.
   StObj.RetVal = "Return Value from AnotherTask"
End Sub
于 2012-11-03T06:25:38.620 に答える
1

他の答えはより良い完全な解決策ですが、尋ねられた質問に答えるには、WebUpdateThread.Joinあなたの前に追加するだけMsgBoxで、コードはスレッドが終了するのを待ってから続行します。

私が言ったように、他の答えはより良いです。なぜなら、それらを使用すると、フォームの塗り直しなど、他のことをより自由に行うことができるからです。

于 2012-11-04T06:34:26.000 に答える