Я пишу приложение Windows Phone 8.1, а его часть - LocalStorage
. Я написал код, как показано ниже, но у него есть серьезная проблема. Мне нужно инициализировать сервис, используя асинхронные методы, и некоторое время после этого, я использую один из его методов (который также является асинхронным).Инициализация объекта async C#
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 является недействительным и я получаю NullReferenceException
. Как синхронизировать эти методы?
Итак, вы предлагаете мне (вариант 1) написать 'await _initializeTask;' сразу после открытия скобки? – Fka
Я даю вам три разных решения, это зависит от вас, чтобы выбрать один. Если вы хотите использовать первое решение, я бы поставил ожидающий вызов прямо перед тем, как попытаться получить доступ к форматированию xml. – Cybrosys
Спасибо за совет :) – Fka