一个任务在多次调用时抛出AggregateException

本文关键字:调用 AggregateException 一个 任务 | 更新日期: 2023-09-27 18:16:26

我的问题是,当用户单击按钮时,正在调用SpeicherUser()。它通过异步使用XMLSerialization创建xml文件。因此,当用户非常快速地点击按钮时,任务将被一遍又一遍地调用,如果它没有完成(创建新的xml文件),则会弹出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—当用户创建一个新的user时,另一个将被启用。因此XML文件将被保存,按钮将被禁用。但这不是一个真正的解决方案……就像我说的,这只是一个变通办法,并不能真正解决问题。

问题:我如何处理static async public Task Save<T>()的AggregateException,它说'发生了一个或多个错误。' -> Access denied (Exception from HRESULT: 0x80070005 (EACCESSDENIED))

一个任务在多次调用时抛出AggregateException

异步编程确实迫使您以不同的方式设计UI。在这种情况下,你的UI有一个额外的状态创建用户

处理这些短暂状态的一种常用方法是在操作进行时禁用按钮,例如:

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

或者,您可以捕获异常并忽略它(因为它可能意味着已经有一个Add正在进行中)。