0

SOや他の場所で同様の質問をいくつか見ましたが、どれもうまくいかないようです。

プロジェクトにLoadingAnimationWindowを含む小さなものがあり、アプリケーションの起動時に表示され、実際の処理を実行し続けたいと考えています。これが私のスタートアップコードです:

Dim WaitWindow As New WaitWindow("Loading application...")
WaitWindow.Show()
LongRunningLoading()
WaitWindow.Close()

LongRunningLoading()アニメーションのブロックを回避するために、別のスレッドで実行しようとする関数は次のとおりです。

Private Function LongRunningLoading() As Boolean
    Dim resetEvent As New System.Threading.ManualResetEvent(False)

    Dim RetVal As Boolean = False
    ThreadPool.QueueUserWorkItem(Sub(state)
                                    'DO SOMETHING AND RETURN RESULTS
                                    resetEvent.Set()
                                 End Sub,
                                 RetVal)

    resetEvent.WaitOne()
    Return RetVal
End Function

読み込み中のアニメーションが再生されないことを除いて、すべてが期待どおりに機能します。私は何が間違っているのですか?

4

3 に答える 3

1

私は何を間違っていますか?

あなたはこれをやっています:

resetEvent.WaitOne()

これにより、UI スレッドがブロックされます。そうしないでください。代わりに、UI は基本的にイベント ベースであることを覚えておいてください。VB 11 の非同期機能を使用していない限り、イベント ベースの方法でコードを記述する必要があります。したがって、基本的に長時間実行されるタスクが完了したら、UI スレッドにポストバックしてその部分を実行する必要がありますWaitWindow.Close()

.NET 4.5 と VB 11 を使用できる場合Task.Run長時間実行される作業のために新しいタスクを開始し、Awaitそのタスクを非同期メソッドから開始するために使用できます。

于 2013-02-25T07:14:55.257 に答える
0

どちらも UI スレッドで実行されているため、アニメーションの読み込みが待機しています。LongRunningLoading プロセスに BackgroundWorker を使用してみて、結果が必要な場合は UI スレッドに戻ります。

于 2013-02-25T07:14:05.380 に答える
0

このアプローチは私のために働いた:

   Dim waitwindow As New WaitWindow("Loading application...")

   ThreadPool.QueueUserWorkItem( _
        Sub()
            LongRunningLoading()
            Dispatcher.Invoke(New Action(AddressOf waitwindow.Close))
        End Sub)

    waitwindow.ShowDialog()

他の誰かを助けるかもしれません。

于 2013-03-02T14:47:32.307 に答える