我有一个类,旨在为在整个应用程序中多次使用的某些特定文件提供对某些元数据的快速访问。不幸的是,一些元数据只能通过非常长时间运行的方法调用来提取。
我有另一个类为长时间运行的方法提供异步包装器(可能是 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