アプリケーション全体で複数回使用される特定のファイルのメタデータにすばやくアクセスできるように設計されたクラスがあります。残念ながら、一部のメタデータは、非常に長時間実行されるメソッド呼び出しでしか抽出できません。
長時間実行されるメソッドの非同期ラッパーを提供する別のクラスがあります (ファイルのサイズによっては 5 分以上かかる場合があります) が、この非同期メソッドを呼び出す方法と、それが適切かどうかを理解しようとしています。それをコンストラクターに入れるか、このシナリオに適した設計パターンがあるかどうか。
私の質問を試して説明するための疑似コードを次に示します。
public class MetaData
{
public string Data1 { get; private set; }
public string Data2 { get; private set; }
public MetaData(String filepath)
{
var extractor = new ExtractMetaData(filepath); //create instance of class that fetches the metadata
this.Data1 = extractor.GetData1(); // short running method
extractor.Data2Received += Data2Received;
extractor.GetData2Async(); // long running method, called with via async method
}
private void Data2Received(object sender, MetaDataEventArgs args)
{
this.Data2 = args.Data; // finally set Data2 property
}
}
class ExtractMetaData
{
public event Data2ReceivedEventHandler Data2Received;
public ExtractMetaData (string filePath) { }
public String GetData1(); // very fast method to get Data1
public void GetData2Async(); // very slow method to get Data2
}
私が理解しようとしているのは、これを達成するためのより良い方法があるかどうかです。
現在のコードでは、構築されるのを待つ必要はほとんどありませんが、メソッドが返されてイベントが発生する前MetaData
に誰かがMetaData.Data2
プロパティにアクセスしようとすると、応答が返されます。ただし、返された後に if を呼び出すと、正しい情報が含まれます。このメソッドが完了したことをユーザーに通知する方法が本当にないため、コンストラクターを待つ必要はなく、すべてのプロパティが完了するまで待たなければならないため、これがユーザーエクスペリエンスの低下につながるのではないかと心配しています。悩ませる。GetData2Async()
Data2Received
null