Как предотвратить изменение пользователем данных во время выполнения async метода сохранения этих данных?

Я разрабатываю WPF проект. По паттерну Репозиторий у меня есть два репозитория, чья имплементация уже готова. Они не используют асинхронность, однако я хочу её добавить. И меня вот что смущает: во время того, как пользователь нажмёт кнопку "Сохранить", что, например, запустит асинхронность, пользователь во время сохранения данных может попробовать изменить данные, например, в ячейках, в котороых он их вводил. Подумал, что CuncurrencyBag решит все проблемы. Написал небольшой тест с ним:

Person person = new Person();
person.Name = "Denis";

var list = new ConcurrentBag<Person>();
list.Add(person);

var task = ChangeVariableAsync(list); // задача начинает выполняться
var el = list.Last(p => p.Name == "Denis");
el.Name = "Dmitry";
Console.WriteLine($"New name: {el.Name}");

await task; // ожидаем завершения задачи

// определение асинхронного метода
async Task ChangeVariableAsync(ConcurrentBag<Person> people)
{
    await Task.Delay(5000);
    try
    {
        var esl = list.Last(p => p.Name == "Denis");
        esl.Name += "s";
        Console.WriteLine($"Old name: {esl.Name}");
    }
    catch (Exception)
    {
        var esl = list.Last(p => p.Name == "Dmitry");
        Console.WriteLine($"Old name: {esl.Name}");
    }
}



class Person
{
    public string Name { get; set; }
}

Однако данные всё равно изменились. Как можно запретить пользователю изменять данные во время работы асинхронного метода, чтоб при этом не потерялся смысл асинхронности? (бо мы ж её добавляем как раз для того, чтоб основной поток не блокировался).

Или как можно сделать так, чтоб изменения, которые пытается сделать пользователь, не повлияли на сохраняемые данные?

У меня только что появилась идея, мол, что если, пока будет сохранение данных, то сделать ползунок, который показывает, сколько осталось времени? Или сделать что-то наподобие такого. Что скажете?

Или какое решение тут стоит применить?


Ответы (0 шт):