繁体   English   中英

C#异步对象初始化

[英]C# async object initialization

我正在编写Windows Phone 8.1应用程序,它的一部分是LocalStorage访问。 我编写了如下所示的代码,但是存在一些严重的问题。 我需要使用异步方法初始化服务,过一会儿,我正在使用其中一种方法(也是异步的)。

Service : IService
{
    private XmlFormatter xmlFormatter;

    public Service()
    {
        Initialize();
    }

    public async IList<Model> GetModelsAsync()
    {
        return xmlFormatter.GetModels();
    }

    private async void Initialize()
    {
        try
        {                
            StorageFile item = (StorageFile)await ApplicationData.Current.LocalFolder.GetItemAsync(this.settings.Get<string>(SettingNames.DataFilename));

            using (Stream readStream = await item.OpenStreamForReadAsync())
            {
                xmlFormatter = new XmlFormatter(XDocument.Load(readStream));
            }
        }
        catch (FileNotFoundException)
        {
            CreateFile();
            xmlFormatter = new XmlFormatter(null);
        }
        catch (Exception)
        {
            throw;
        }
    }
}

问题在于GetModelsAsync方法在Initialize方法结束之前运行,因此xmlFormatter为null,并且我收到NullReferenceException 如何同步这些方法?

切勿在ctor中执行长时间运行的进程,请单独调用initialize。

有多种解决方案。 我建议保存从Initialize方法返回的Task。 然后,我将在GetModelsAsync中调用: await _initializeTask; 在尝试使用xml格式化程序之前。

另一个解决方案是抛出一个异常,说明您的服务尚未初始化,但是由于用户不是调用Initialize的用户,因此这将是一个糟糕的设计。

第三是使Initialize方法公开,并由用户负责调用它,并确保它在调用类中的其他方法之前已完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM