#c# #sqlite #asynchronous #xamarin.forms
#c# #sqlite #асинхронный #xamarin.forms
Вопрос:
потому что он не учитывает ожидание
public async Task Save(Ticket header, TicketLines newLines)
{
Debug.WriteLine("init save");
await dbConnection.RunInTransactionAsync(new Action<SQLite.Net.SQLiteConnection>(tran =>
{
dbConnection.InsertAsync(header).ContinueWith((t) =>
{
Debug.WriteLine("-> New header ID: {0}", header.Id);
foreach (var item in newLines)
{
item.DocumentId = = header.Id;
}
dbConnection.InsertAllAsync(newLines);
});
//tran.Commit();
}));
Debug.WriteLine("End Save");
}
Заказать отладку
- инициализация сохранения
- Завершение сохранения sds
- ->Новый идентификатор заголовка: 1
Комментарии:
1. может быть, потому, что он не понимает, что вы пытаетесь сделать… значение, пожалуйста, отредактируйте это и задайте реальный вопрос..
2. На самом деле вы ничего не ожидаете в самом делегате.
Ответ №1:
у вас есть два асинхронных вызова, которые не ожидаются (перед ними нет ключевого слова await)
public Save(Ticket header, TicketLines newLines) {
Debug.WriteLine("init save");
dbConnection.RunInTransactionAsync(new Action<SQLite.Net.SQLiteConnection>(tran =>
{
dbConnection.Insert(header).ContinueWith((t) =>
{
Debug.WriteLine("-> New header ID: {0}", header.Id);
foreach (var item in newLines)
{
item.DocumentId = = header.Id;
}
dbConnection.InsertAll(newLines);
});
//tran.Commit();
}));
Debug.WriteLine("End Save");
}
Комментарии:
1. я только что скопировал часть его кода и добавил ожидание, но я могу добавить остальное, чтобы сделать ответ более понятным, если хотите.
2. Я не могу реализовать транзакцию, в случае ошибки прервать все вставки
3. хорошо, читая ваш вопрос, я вижу, что вы записали журнал вывода отладки. инициализация сохранения -> Завершение сохранения sds -> Новый идентификатор заголовка: 1. это то, что делает await, позволяет запустить функцию и продолжить текущее выполнение, что вам делать? запустить его линейно?
4. Я объясню. У меня есть кнопка сохранения пользовательского интерфейса, и мне нужно сохранить записи, и только после записи всего экрана регистрации и обновления. Что со мной происходит, так это то, что, поскольку сохранение асинхронной задачи ожидает включения всех записей, я обновляю экран, но по-прежнему не имею записей в базе данных
5. что ж, вы можете добиться этого, если удалите асинхронность и задачу из определения вашего метода и удалите операторы await, но ваш пользовательский интерфейс будет заблокирован во время выполнения транзакции.