Я разрабатываю 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; }
}
Однако данные всё равно изменились.
Как можно запретить пользователю изменять данные во время работы асинхронного метода, чтоб при этом не потерялся смысл асинхронности? (бо мы ж её добавляем как раз для того, чтоб основной поток не блокировался).
Или как можно сделать так, чтоб изменения, которые пытается сделать пользователь, не повлияли на сохраняемые данные?
У меня только что появилась идея, мол, что если, пока будет сохранение данных, то сделать ползунок, который показывает, сколько осталось времени? Или сделать что-то наподобие такого. Что скажете?
Или какое решение тут стоит применить?