2012-04-24 19 views
1

これを行う方法はありますか?Silverlightイベントを発生させ、さらに1秒後に別のイベントを発生させます

背景: 私はボタンをクリックしています。ボタンがクリックされると、私は「読み込み中」のメッセージを表示しようとし、いくつかのUI作業を行うコードを実行し、「読み込み中」のメッセージを閉じます。通常数秒から20秒の間でどこでもかかります。現時点では、ロードメッセージはまったく表示されず、ボタンがクリックされるまでUIがフリーズします。

バックグラウンドワーカーとディスパッチャについては読んだことがありますが、動作させることができませんでした。ボタンクリックのコードが(サードパーティのものを含めて)あらゆる種類の他のコードを呼び出すためですが、それが正しく動作するようにはできていないからです。それでもすべて動作しますが、UIはフリーズして読み込みメッセージは表示されません。

これを回避する別の方法があるのでしょうか。それは、ボタンをクリックするだけで、私は長時間実行しているプロセスを実行する別のイベントを起動し、ローディングメッセージを表示し、次に2番目またはそれ以降のようにそれを設定することは可能ですか?そうすれば、UIはまだ数秒間フリーズしますが、少なくとも「読み込み中」のメッセージが表示されます。

+0

BackgroundWorkerを使用すると、UIがフリーズせずに問題がすべて解決されます。あなたはそれでどんな問題に遭遇しましたか? BackgroundWorkerの重要なトリックは、UI要素のメソッドを呼び出すときにDispatcher.Invoke()を使用する必要があることです。 –

+0

本当にわかりません。私はBackgroundWorkerとDispatcherを使用し、アプリケーションはボタンのクリック後にアプリケーション全体をフリーズすることを含めて正常に機能しました。この問題は、スレッドやUIに関連するものではないかもしれません。プロセスが完了するまでに時間がかかるかもしれない。私はCPUが50%になるのを見ています。何か大きなことが起こっていない限り、通常は起こりません。 – dtc

+0

チャート要素自体の呼び出しのような音が遅いです。 System.Threading.Timerはあなたが探しているものです。 –

答えて

1

Dispatcher.BeginInvokeコールでこれを行うことができます。

private void ButtonClick(object sender, EventArgs e) 
{ 
    ShowMyLoadingMessage(); // your code, not sure what it is 
    Dispatcher.BeginInvoke(() => 
    { 
     CallMyLongRunningCode(); // again, not sure what this is 
     HideMyLoadingMessage(); 
    } 
} 

私はそれがUIスレッドで実行されているので、これが最善の解決策であるとは思わないが、それはあなたが求めているものを行う必要があります。

長時間実行しているコードは20秒かかりますか?

+0

このコードは正常に動作しますが、問題は緩和されません。 OKボタンをクリックすると、プロセスが完了してローディングインジケータが表示されなくなるまで、アプリケーション全体がフリーズします。長時間実行されているコードは、サードパーティのライブラリを使用してデータからチャートを作成します。 – dtc

+0

はい、あなたが問題を説明したとき、私はそれを恐れていました。長時間実行しているコードがチャートのデータを取得しているか、チャートを作成していますか? – Bryant

+0

データベースから既に取得されたデータを使用します。次に、データに基づいてチャートを作成します。限り、私はそれが持っているデータに基づいてゼロからグラフを構築することがわかります。しかし、その後のコードではあまり慣れていないので、少なくとも画面が固定されている間はローディングインジケータを表示するより高速なソリューションを検討しています。 – dtc

関連する問題