2

UI スレッドから移動できない、UI スレッドで実行される長時間実行プロセスがあります。代わりに、待機中のアニメーションを持つ 2 番目の UI スレッドを作成しようとしています。2 番目の UI スレッドを作成するために使用しているコードは次のとおりです。

Private _busyThread As Thread
Private _waitWindow As WaitWindow 'This is the window with the animation

Private Sub StartBusyIndicator(ByVal busyInfo As BusyInfo)
    _busyThread = New Thread(New ThreadStart(AddressOf ThreadStartingPoint))
    _busyThread.SetApartmentState(ApartmentState.STA)
    _busyThread.IsBackground = True
    _busyThread.Start()
End Sub

Private Function ThreadStartingPoint() As ThreadStart
    _waitWindow = New WaitWindow
    _waitWindow.Show()
    System.Windows.Threading.Dispatcher.Run()
End Function

必要なときにこれを優雅に閉じるにはどうすればよいですか? _waitWindowメイン UI スレッドからアクセスして閉じることができません。私が発行_busyThread.Abort()しても、実際にはウィンドウを閉じません。

4

1 に答える 1

5

Dispatcher.BeginInvokeウィンドウを閉じるには、次を使用する必要があります。

これにより、ウィンドウを閉じる呼び出しが新しいウィンドウのスレッドにマーシャリングされます。

ただし、これはそのスレッドをシャットダウンしません。これを行うには、次を試してください。

_waitWindow.Dispatcher.BeginInvoke(Sub()
         _waitWindow.Dispatcher.BeginInvokeShutdown(DispatcherPriority.Background)
         _waitWindow.Close()
    End Sub)

私のブログには、これやその他の問題について詳しく説明している記事があります。これは C# ですが、VB.Net に簡単に変換できます。

長期的には、実行時間の長いプロセスをメイン スレッドから切り離す方法を考え出すことがより良い解決策になることに注意してください。これは、アプリケーションが Windows とエンド ユーザーに応答しないように見えるままになるためです。

于 2013-08-05T21:03:04.340 に答える