デスクトップベースのWinFormsアプリケーションがあります。アプリケーションはデータベース内でいくつかの非常に複雑なロジックを実行し、時間がかかるようにバインドされています。長い間、処理に1分から20分かかります。この間、ユーザーは何もできず、進行状況バーを監視する必要があります。今、私達は計算がそのようなものであることをクライアントに伝えました。それは速く行くことができません。彼ははい、最適化されているが、エンドユーザーにとっては遅いと感じていることを認めています。
UIで長時間実行される操作をどのように処理すれば、アプリケーションが非常に応答性が高く高速であるかのような錯覚を引き起こす可能性があることについて、いくつかの提案が必要でした。
私の考えは、現在ユーザーは非常に静的な進行状況バーを監視しているということでした。処理中に到達した場所にテキストまたは通知を入れると、ユーザビリティに影響を与える可能性があります。
ありがとう
これらの計算がオンデマンドであるかどうか、またはそれらが何であるかはわかりませんが、遅いデータ計算のためのUIも作成しました。
ユーザーがアプリケーションで実行できるのはそれだけではないため、すべてのレベルですべてを非同期にしました。
1つのレベルは、事前計算とキャッシングです。ほとんどのユーザーは約10〜20のレポートを表示したいと考えています。計算には10秒から1時間かかります。
そのため、ユーザーが前日と毎晩彼らをお気に入りとしてマークし、それらが計算されるようにしたので、ユーザーは毎朝システムにアクセスして即座に結果を確認できます。
もう1つのレベルは非同期UIでした。
高速と低速のレポートがあるため、UI全体を非同期にしました。これにより、レポートの読み込み中に、ユーザーはさまざまなことを実行できます。
待機中にブロックされたUIはありません。
これは、ユーザーが座って待つ必要がないので、待ち時間全体がユーザーにとって非常に魅力的なものになりました。
非同期計算の実装は、待機中のユーザーにとって不便な理由を完全に排除するため、最良のソリューションです。しかし、アプリケーションを根本的に再設計できない場合もあります。したがって、同期計算の場合、次のいずれかを実行する必要があります-ユーザーの注意をそらすか、計算時間の見積もりをユーザーに与えます。最も簡単な方法は、計算の推定時間を表示することです。これにより、ユーザーの不快な不確実性が軽減され、計算が完了するまでの時間を計画することができます-滞在するか、コーヒーを飲みに行くか。注意をそらす最も簡単な方法は、静的な進行状況バーにダイナミズムを何らかの方法で追加することですが、計算自体に追加のオーバーヘッドが発生する可能性があります。
ロードに1分かかるアプリケーションは、別の方法で設計する必要があります。ユーザーを2013年に最大20分間非生産的な状態にしておくことはできません。設計の観点から、ユーザーの経験を節約するには、次の3つのいずれかを行う必要があります。
より優れたハードウェアを使用。より良い(より速く、より大きく、より強い)ハードウェアを使用することで、トラブルから身を守ることができるので、これは明白な選択です。メモリを最大4まで増やしますTBはWindows Server 2012で可能ですが、おそらく必要ありません。これはコストのかかるオプションですが、お客様にとって機能しない場合...
キャッシュされたデータを使用。これらの重要な計算を実行する別のサーバーで、結果をWebアプリ/ネイティブアプリに接続されたSQLサーバーに配信します。必要に応じて、これらの計算を1時間ごとに行うことができます。しかし、それが選択肢でなければ...
スレッドの実装。 OK、これらの計算を「ライブ」で行う必要があります。「ライブ」とは、最大20分の古いデータを意味します。しかし、ユーザーがダッシュボードから強力なクエリを実行できるようにしてから、システム内で他のことをするために離れることができます。計算が完了すると、ユーザーには計算が完了したことが通知され、結果を消費するダッシュボードに戻ることができます。
あなたがそれらのいずれかを空想した場合、さらに改善するためのいくつかのアイデア。
長いタスクをサブタスクに分割し、これらのサブタスクの進行状況を表示できます。これにより、物事が完了しているように見えます。
手元のタスクに厳密に関連しないいくつかの有用な情報を提供できます。これにより、ユーザーは、プロセスが完了するのを待っているだけではなく、完全に非生産的ではないという印象を与えます。
プロセスが完了したら通知を表示したり、ユーザーが操作をオプトアウトできない場合に保存して続行する方法を提供したりするなど、長いプロセスで何をしたいかについてユーザーにいくつかのオプションを与えることができます。