2

私の WPF C# アプリケーションでは、処理中に小さな円のアニメーションを表示して、アプリケーションが "考えている" ことをユーザーに知らせ、リラックスする必要があります。別のexeです。たとえば、ユーザーがボタンをクリックして分析を実行すると (5 ~ 10 秒かかる場合があります)、アニメーションを表示するプロセスを開始し、すべてが完了したらプロセスを停止します。この間、バックグラウンド タスクを処理するためにサブスレッドが新たに生成されました。完了すると UI が更新されますが、データグリッドが複雑なため数秒かかる場合があります。

これは技術的には機能しますが、別の方法でアプローチしたいと思います。スレッドが動作しているときにアプリケーションが自動検出してアニメーションを自動的に表示し、スレッドがすべて完了すると、アニメーションの表示を停止するようにしたいと思います。バックグラウンド スレッドは簡単に検出できますが、UI スレッドを検出するにはどうすればよいですか? 誤ってアプリケーションを強制終了するのを逃したことが何度かあり、処理が完了した後もアプリケーションがまだ実行されていたので、私はむしろこの方法でやりたいと思います。これはそれを防ぐでしょう。

UI スレッドの開始時と停止時に発生するイベントはありますか? そうでない場合は、1/2 秒ごとに起動するタイマーをそこに投げたとしましょう。UI スレッドの状態を教えてくれる呼び出しはありますか?

ありがとう

4

3 に答える 3

2

より良いアプローチは、処理を UI の外に移動することです (たとえばBackgroundWorker、バックグラウンド ワーカーが通知を UI スレッドに投稿できるようにします (開始、進行状況の更新、終了)。

車輪を再発明したり、処理ロジックを UI スレッドの外に移動したりしないでください。

于 2013-01-10T15:01:47.173 に答える
1

Dispatcherアプリケーションの:を介して、非常に低い優先度でメインUIスレッドにタスクを追加しようとすることができます。

Application.Current.Dispatcher.BeginInvoke((ThreadStart)StopAnimation, DispatcherPriority.ApplicationIdle);

...

private void StopAnimation()
{
    ...
}

これは基本的に、「メインUIスレッドに何もすることがまったくない場合は、StopAnimation()を呼び出します」と言います。.BeginInvoke秘訣は、グリッドの読み込みの直前または最中に、呼び出す適切なタイミングを見つけることです。

于 2013-01-10T23:39:22.937 に答える
1

キャッチ22です。UI スレッドがブロックされていることを確認するために実行できるコードがある場合、UI スレッドがブロックされているため、アニメーションを開始できません。アニメーションは、UI スレッドが作業中のタスクを終了するまで表示されず、その時点でアニメーションは関連しなくなります。

ほとんどの場合、長時間実行されるタスクを UI スレッドではなく、別のバックグラウンド スレッドに移動する必要があります。このようなタスクの開始時にフォーム上のコントロールの一部またはすべてを明示的に無効にし、最後に有効にすることができます。フォームを無効にする手段として UI スレッドをブロックしないことを 強くお勧めします。ユーザーの観点からは、それが望ましい動作であると考えるのではなく、プログラミングのバグが原因でプログラムが動作していないように見えるからです。

于 2013-01-10T15:01:12.817 に答える