1

ユーザーが選択した大きなファイルを処理しています。私のコードは次のようになります。

if (FileDialog.ShowDialog() == true) { 
    // process really big file
}

これにより UI がフリーズするため、ユーザーがファイルを選択する前に、最初に読み込みメッセージを表示して、何かが起こっていることを視覚的に示すようにしました。

loadingMessage.Visibility = Visibility.Visible;
if (FileDialog.ShowDialog() == true) { 
    // process really big file
}

残念ながら、これでもファイルの処理中に UI が完全にフリーズします。

ファイルを選択した直後に MessageBox を起動すると、完全に機能することがわかりました。ランタイムでイベント/UIアイテムをフラッシュするために、フードの下で「DoEvents」タイプの呼び出しを行うと思います。

loadingMessage.Visibility = Visibility.Visible;
if (FileDialog.ShowDialog() == true) {
    MessageBox.Show("Sync!");
    // process really big file
}

このような場合でも、大きなファイルの処理は遅くなりますが、読み込みメッセージが表示され、画面の UI が同期されます (待機カーソルを表示するなど、実際には他のことを行っています)。

質問:

Silverlight には DoEvents 機能がありません。MessageBox.Show 以外に、UI を同期させ、OpenFileDialog が UI をフリーズするのを防ぐのと同じ効果を持つ呼び出しはありますか?

4

2 に答える 2

2

BackgroundWorker クラスを使用して、バックグラウンド スレッドで非常に大きなファイルを処理しますか? ここにリンクがあります:方法: BackgroundWorker を使用する

于 2009-11-13T18:31:46.673 に答える
1

バックグラウンドで負荷の高い計算を実行するには、BackgroundWorker を使用します。操作が完了したことを UI に通知したい場合は、前述のクラスの RunWorkerCompleted イベントを使用できます。これに代わる方法は、完全に別のスレッドを使用してから、Dispatcher.BeginInvoke() を使用して UI スレッドにコールバックすることです。別のスレッドの .NET では、この種の同期なしでは GUI コンポーネントにアクセスできないことに注意してください。

于 2009-11-13T18:46:14.193 に答える