C#事前非同期ロードデータ
6756 ワード
前言
私たちのアプリケーションでは、データベースまたはローカルから大きなデータを読み込む必要があり、使い捨てであれば、事前にデータを取得してメモリにキャッシュすることができます.
一般的な処理方法:アプリケーションがユーザーが機能を使用するまで起動し、データを事前にロードします.
問題が発生しました.データサイズの不固定性のため、事前にロードする速度が速くて遅くて、もしデータベースを繰り返して読み込まないことを保証して、一度だけ結果を返しますか?
Task ConfigureAwait
ConfigureAwaitを使用すると、上記の問題を解決できます.詳細は次のとおりです.
プログラムが起動すると、対応するイベントで初期化メソッドが呼び出されます.
ConfigureAwaitを使用して非同期でデータを取得する
ConfigureAwaitの使用により、結果の戻りを待たない.
パッケージングデータ遅延タスクの追加
プログラム起動直後にキャッシュをロードするのではなく、プログラム使用中のデータキャッシュの処理です.キャッシュ遅延タスクのカプセル化は、キャッシュデータが一度だけ取得されることを保証するために追加できます.
キャッシュデータの取得
Task.Resultを使用して、キャッシュ・タスクの結果を取得します.このキャッシュ・タスクのステータスは次のとおりです.実行中--実行を続行し、結果 を返します.が完了すると、既存の結果 が返されます.
何度取得してもResultは同じ結果を返すだけで、WordsCacheDelayTask.Resultを静的キャッシュと見なすことができます.
参照リスト:
非同期メソッドを作成する場合は、コンフィギュレーションAwait(false)を使用してユーザーのデッドロックを回避します.
async/await非同期コードを安全なデッドロックしない同期コードに変換する(PushFrameを使用)
私たちのアプリケーションでは、データベースまたはローカルから大きなデータを読み込む必要があり、使い捨てであれば、事前にデータを取得してメモリにキャッシュすることができます.
一般的な処理方法:アプリケーションがユーザーが機能を使用するまで起動し、データを事前にロードします.
問題が発生しました.データサイズの不固定性のため、事前にロードする速度が速くて遅くて、もしデータベースを繰り返して読み込まないことを保証して、一度だけ結果を返しますか?
Task ConfigureAwait
ConfigureAwaitを使用すると、上記の問題を解決できます.詳細は次のとおりです.
プログラムが起動すると、対応するイベントで初期化メソッドが呼び出されます.
1 private Task> _wordsCacheDelayTask;
2 ///
3 ///
4 /// : InitWordInfos ,
5 ///
6 public void InitWordInfos()
7 {
8 if (_wordsCacheDelayTask == null)
9 {
10 _wordsCacheDelayTask = GetWordsTask();
11 }
12 }
ConfigureAwaitを使用して非同期でデータを取得する
ConfigureAwaitの使用により、結果の戻りを待たない.
1 ///
2 ///
3 /// : ,
4 ///
5 ///
6 private async Task> GetWordsTask()
7 {
8 return await Task.Run(() =>
9 {
10 return EnglishDictService.Instance.GetWords();
11 }).ConfigureAwait(false);
12 }
パッケージングデータ遅延タスクの追加
プログラム起動直後にキャッシュをロードするのではなく、プログラム使用中のデータキャッシュの処理です.キャッシュ遅延タスクのカプセル化は、キャッシュデータが一度だけ取得されることを保証するために追加できます.
1 ///
2 ///
3 /// : ,
4 ///
5 public Task> WordsCacheDelayTask
6 {
7 set => _wordsCacheDelayTask = value;
8 get
9 {
10 if (_wordsCacheDelayTask == null)
11 {
12 _wordsCacheDelayTask = GetWordsTask();
13 }
14
15 return _wordsCacheDelayTask;
16 }
17 }
キャッシュデータの取得
Task.Resultを使用して、キャッシュ・タスクの結果を取得します.このキャッシュ・タスクのステータスは次のとおりです.
何度取得してもResultは同じ結果を返すだけで、WordsCacheDelayTask.Resultを静的キャッシュと見なすことができます.
1 ///
2 ///
3 ///
4 private List WordInfosCache => WordsCacheDelayTask.Result;
参照リスト:
非同期メソッドを作成する場合は、コンフィギュレーションAwait(false)を使用してユーザーのデッドロックを回避します.
async/await非同期コードを安全なデッドロックしない同期コードに変換する(PushFrameを使用)