2013-05-31 52 views
0

我的問題是當用戶點擊一個按鈕時,SpeicherUser()被調用。它通過異步使用XMLSerialization創建一個xml文件。所以當用戶非常快速地點擊按鈕時,任務會被一遍又一遍地調用,如果沒有完成(創建新的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(); 
    } 
} 

的的UserList示出在ListView。我目前有1個按鈕,所以當用戶點擊按鈕時,一個新的'用戶'將被添加到ListView中,並且它將立即創建XML文件。爲了解決我的問題,我可以使用2個按鈕做一個單詞卡片: - 一個用於將用戶添加到ListView中 - 另一個僅在用戶創建新用戶時啓用。所以XML文件將被保存並且按鈕將被禁用。 但是這不是一個真正的解決方案......就像我說的,這只是一個解決方法,並沒有真正解決問題。

問題:我怎樣才能處理AggregateException在static async public Task Save<T>()它說「發生一個或多個錯誤。」 - >訪問被拒絕(異常來自HRESULT:0X80070005(EACCESSDENIED)

回答

2

異步編程不強迫你有點不同設計的UI在這種情況下,你的UI有一個額外的狀態,這是創建用戶

一來處理這些短命的國家通常的做法是禁用按鈕,而操作過程中,如:

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

或者,你可以只捕獲異常而忽略它(因爲它可能意味着有已經是了正在進行中)。

+0

我不確定忽略異常是個好主意,因爲它*可能*是一個真正的問題。 – svick

+0

好點。 「訪問被拒絕」太寬泛,以至於認爲它是一個已經打開的句柄。 –

+0

嗯,這實際上更容易。不知道爲什麼我想出了2個按鈕,當我可以啓用/禁用一個按鈕時...這不是解決如何處理異常的答案,但它是一個解決方案,所以我會把它算作一個回答。 – Rudi

相關問題