0

私はC#でウィンドウベースのアプリケーションに取り組んでおり、多くの子コントロールが開いている/編集されている/閉じられているメインMDI親コントロールで実行されているタイマーを実行しています。さて、タイマーコードで、アプリケーション全体がビジーかアイドルかを知りたいと思います。コントロールがデータベースからのデータへのアクセス、挿入クエリの実行、データの削除などのタスクを実行している場合は、アプリケーションがビジーであり、そうでない場合はアプリケーションがアイドル状態であることを知っておく必要があります。

前もって感謝します!

4

2 に答える 2

0

時間のかかるすべてのタスクをバックグラウンド ワーカー ( BackgroundWorker) クラスに配置する必要があります。UI に影響を与えることなく、継続的に監視し、進行状況を取得し、必要に応じて終了できるようにします。

サンプルアプリのリンクはこちら

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

于 2012-06-25T07:40:51.053 に答える
0

Windows フォーム タイマー ( System.Windows.Forms.Timer) を使用している場合、タイマー コード (Tickイベント ) は、UI スレッドがビジー状態のときに実行されることはありませんApplication.DoEvents()。しかし、何らかのタスクを実行するバックグラウンド ワーカーやその他の種類のスレッドがある場合、他のスレッドが何かを実行中であることを明示的に知る方法はありません。

スレッド同期メカニズムを使用して、タイマー イベントで何かを台無しにしないようにする必要があります。いくつかのガード変数を使用することもできます。アーキテクチャの修正を検討することをお勧めします。

編集: タイマーでアプリケーションのアイドル状態を確認することはできません。タイマーが通知する前に、操作が開始されて一瞬で終了した場合はどうなりますか?

最善の方法は、グローバルlastOperationTime変数を用意してDateTime.Now、アクションが実行されるたびにそれを設定することです。次に、タイマーを使用して からの経過時間を確認しlastOperationTimeます。

void idleTimer_Tick (object sender, EventArgs e)
{
    if ((DateTime.Now - lastOperationTime).TotalMinutes > 50)
    {
        ...
    }
}

最も難しい部分は、有用な操作を行うすべてのメソッドにコード行を挿入する方法です! 適切に編成された基本クラスを備えた優れたフレームワークがある場合は、コードを更新する必要がある特定の (有限の) ポイントが存在する可能性がありますlastOperationTime

于 2012-06-25T07:47:57.153 に答える