簡體   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