C#事前非同期ロードデータ

6756 ワード

前言
私たちのアプリケーションでは、データベースまたはローカルから大きなデータを読み込む必要があり、使い捨てであれば、事前にデータを取得してメモリにキャッシュすることができます.
一般的な処理方法:アプリケーションがユーザーが機能を使用するまで起動し、データを事前にロードします.
問題が発生しました.データサイズの不固定性のため、事前にロードする速度が速くて遅くて、もしデータベースを繰り返して読み込まないことを保証して、一度だけ結果を返しますか?
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を使用)