0

私の問題は、ユーザーがボタンをクリックすると、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 つのボタンを使用して回避策を実行できます。そのため、XML ファイルが保存され、ボタンが無効になります。しかし、これは本当の解決策ではありません...私が言ったように、これは単なる回避策であり、実際に問題を解決するものではありません.

質問static async public Task Save<T>(): 「1 つ以上のエラーが発生しました」という AggregateException を処理するにはどうすればよいですか。-> アクセスが拒否されました (HRESULT からの例外: 0x80070005 (EACCESSDENIED)

4

1 に答える 1