0

これに関する他の投稿を読みましたが、まだ正しく機能していないようです。

BackgroundWorker が動作を開始するたびに、関数API.CheckForUpdateが原因で GUI がハングします。何もクリックできません。フリーズするのは 0.5 秒だけですが、気付くには十分です。

どうすればこれを修正できますか? API.CheckForUpdateを深く掘り下げて、特定のステートメントで個々のスレッドを実行する必要がありますか?それとも、これを処理する包括的なスレッドを作成することはできますか? API.CheckForUpdate は Form1 で何も参照しません。

また、Form1_Load は RunWorkerAsync 呼び出しを配置するのに最適な場所ではないと思います。より良い場所はどこですか?

'Declarations
Dim ApplicationUpdate As BackgroundWorker = New BackgroundWorker

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ApplicationUpdate.WorkerSupportsCancellation = True
    ApplicationUpdate.WorkerReportsProgress = True
    AddHandler ApplicationUpdate.DoWork, AddressOf ApplicationUpdate_DoWork
    AddHandler ApplicationUpdate.ProgressChanged, AddressOf ApplicationUpdate_ProgressChanged
    AddHandler ApplicationUpdate.RunWorkerCompleted, AddressOf ApplicationUpdate_RunWorkerCompleted
    ApplicationUpdate.RunWorkerAsync()
End Sub

Private Sub ApplicationUpdate_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
    'Check for an update (get the latest version)
    Dim LatestVersion = API.CheckForUpdate
End Sub

Private Sub ApplicationUpdate_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs)
    'Nothing here
End Sub

Private Sub ApplicationUpdate_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
    'Work completed
    MsgBox("Done")
End Sub
4

2 に答える 2

1

バックグラウンドワーカーの修正ではありませんが、歩き回って答えが見つからなくても構わない場合は、次のようにコーディングできます。

VB には「デフォルト フォーム インスタンス」の概念があるため、最初にスレッドを開始し、モデルでコーディングする場合は、最初のスレッドに (me) を渡す必要があることに注意してください。アプリケーションの名前空間内のすべての Form に対して、Forms プロパティの下の My 名前空間に既定のインスタンスが作成されます。

そして、それはそのように追加のパラメータを追加するだけです

---------------------- / メインスレッドの開始 / ----------------------- ------------

Private Sub FindCustomerLocation()
Dim Findcontractor_Thread As New Thread(AddressOf **FindContractor_ThreadExecute**)
Findcontractor_Thread.Priority = ThreadPriority.AboveNormal
Findcontractor_Thread.Start(me)
End Sub

------------------ / ランニングスレッド / ---------------

Private Sub **FindContractor_ThreadExecute**(beginform as *NameOfFormComingFrom*)
Dim threadControls(1) As Object
threadControls(0) = Me.XamDataGrid1
threadControls(1) = Me.WebBrowserMap

**FindContractor_WorkingThread**(threadControls,beginform) ' ANY UI Calls back to the Main UI Thread MUST be delegated and Invoked
End Sub

------------------ / スレッドから UI 呼び出しを設定する方法 / ----------------------

Delegate Sub **FindContractor_WorkingThread**(s As Integer,beginform as       *NameOfFormComingFrom*)
Sub **FindContractor_WorkingThreadInvoke**(ByVal s As Integer,beginform as     *NameOfFormComingFrom*)
If beginform.mouse.InvokeRequired Then
Dim d As New FindContractor_WorkingThread(AddressOf        FindContractor_WorkingThreadInvoke)
beginform.Invoke(d, New Object() {s,beginform})
Else
 beginform.Mouse.OverrideCursor = Cursors.Wait

'Do something...

beginform.Mouse.OverrideCursor = Nothing
End If
End Sub

Pakks のソースはテスト済みです。

于 2013-07-25T18:08:43.127 に答える
0

Load イベントの外でプロセスを開始してみてください。タイマーを作成し、Load イベントで開始してから、ティックのイベントを処理します。

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    Timer1.Enabled = False
    ApplicationUpdate.RunWorkerAsync()
End Sub
于 2013-07-16T05:33:53.490 に答える