2013-05-31 5 views
0

моя проблема в том, что когда пользователь нажимает на кнопку, вызывается 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)

ответ

2

программирования Асинхронного делает заставить вас создать свой пользовательский интерфейс немного по-другому в этом случае, ваш пользовательский интерфейс имеет дополнительное состояние, которое создание пользователя

.

Один общий подход к решению этих короткоживущих состояний является отключение кнопки во время операции в процессе, например:

async void AddButton_Click(..) 
{ 
    addButton.IsEnabled = false; 
    await Save(); 
    AddToListView(); 
    addButton.IsEnabled = true; 
} 

в качестве альтернативы, вы можете просто поймать исключение и игнорировать его (так как это, вероятно, означает, что уже есть Add).

+0

Я не уверен, что игнорирование исключения - хорошая идея, так как это может быть реальной проблемой. – svick

+0

Хорошая точка. «Доступ запрещен» слишком широк, чтобы предположить, что это уже открытая ручка. –

+0

Ну, это на самом деле проще. Не знаю, почему я придумал 2 кнопки, когда я могу включить/отключить одну кнопку ... Это не ответ на то, как обрабатывать исключение, но это решение, поэтому я буду считать его как ответ. – Rudi

Смежные вопросы