моя проблема в том, что когда пользователь нажимает на кнопку, вызывается SpeicherUser(). Он создает XML-файл с помощью XMLSerialization асинхронно. Поэтому, когда пользователь нажимает очень быстро и все время на кнопке, задача вызывается снова и снова, и если она не завершена (создание нового xml-файла), появляется сообщение AggregateException.Одна задача выбрасывает AggregateException при множественном вызове
Это код:
public class UserList
{
private static List<User> _personen = new List<User>();
public List<User> Personen
{
get { return _personen; }
set { _personen = value; }
}
public static StorageFile file { get; set; }
private const string filename = "Personen.xml";
public UserList()
{
md.Title = "Fehler beim Speichern";
Personen = new List<User>()
{
new User(){ID = 1,
Name = "TestUser1"},
new User(){ID = 2,
Name = "TestUser2"}
};
}
public async Task SpeicherUser()
{
await Save<UserList>();
}
static async public Task Save<T>()
{
if (await DoesFileExistAsync(filename))
{
//AggregatException pops up here: UserList.SaveAsync<T>().Wait()
await Windows.System.Threading.ThreadPool.RunAsync((sender) => UserList.SaveAsync<T>().Wait(), Windows.System.Threading.WorkItemPriority.Normal);
}
else
{
file = await ApplicationData.Current.LocalFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
}
}
static async Task<bool> DoesFileExistAsync(string fileName)
{
try
{
await ApplicationData.Current.LocalFolder.GetFileAsync(fileName);
return true;
}
catch
{
return false;
}
}
static async private Task SaveAsync<T>()
{
StorageFile sessionFile = await ApplicationData.Current.LocalFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting);
IRandomAccessStream sessionRandomAccess = await sessionFile.OpenAsync(FileAccessMode.ReadWrite);
IOutputStream sessionOutputStream = sessionRandomAccess.GetOutputStreamAt(0);
var serializer = new XmlSerializer(typeof(List<User>), new Type[] { typeof(T) });
//Using XmlSerializer
serializer.Serialize(sessionOutputStream.AsStreamForWrite(), _personen);
sessionRandomAccess.Dispose();
await sessionOutputStream.FlushAsync();
sessionOutputStream.Dispose();
}
}
список пользователей показан в ListView. У меня есть на данный момент 1 кнопка, поэтому, когда пользователь нажимает на кнопку, в ListView будет добавлен новый «Пользователь», и он создаст сразу после него XML-файл. Чтобы решить мою проблему, я мог бы сделать wordkaround с помощью 2 кнопок: - Один для добавления пользователя в ListView - Другой будет включен, только когда пользователь создаст нового пользователя. Таким образом, файл XML будет сохранен, и кнопка будет отключена. Но это не настоящее решение ... Как я уже сказал, это всего лишь обходное решение, и на самом деле не проблема.
Вопрос: Как я могу обработать исключение AggregateException в static async public Task Save<T>()
, в котором говорится: «Произошла одна или несколько ошибок». . -> Доступ запрещена (Исключение из HRESULT: 0x80070005 (EACCESSDENIED)
Я не уверен, что игнорирование исключения - хорошая идея, так как это может быть реальной проблемой. – svick
Хорошая точка. «Доступ запрещен» слишком широк, чтобы предположить, что это уже открытая ручка. –
Ну, это на самом деле проще. Не знаю, почему я придумал 2 кнопки, когда я могу включить/отключить одну кнопку ... Это не ответ на то, как обрабатывать исключение, но это решение, поэтому я буду считать его как ответ. – Rudi