У меня есть приложение .NET 8 wpf, которое использовало набор инструментов сообщества Microsoft для MVVM и внедрения зависимостей расширений Microsoft, а также платформу EF-Core. В дополнение к представлениям и моделям представлений у меня есть класс Repo, который использует асинхронные сообщения для запроса данных с помощью EF-Core.
Приложение создает представление списка, и пользователь щелкает элемент, что вызывает изменение свойства элемента. и вызывает асинхронный метод в репозитории, который извлекает запись из базы данных.
Проблема возникает, если пользователь выбирает новый элемент до того, как был получен предыдущий элемент (т. е. он щелкнул не тот элемент и хочет щелкнуть по нему). еще один). Я получаю сообщение об ошибке «Вторая операция была начата в этом экземпляре контекста до завершения предыдущей операции».
Я пробовал изменить контекст данных и области службы, но это не решило проблему. Давайте сохраним этот вопрос для другой темы.
В этом сценарии новый вызов асинхронного метода выполняется всякий раз, когда пользователь меняет выбранный элемент. Как я могу определить, был ли завершен предыдущий вызов, прежде чем выполнять новый вызов?
Решение, которое я реализовал, установив свойство внутри метода, которое определяет, завершена ли задача, работает, но есть ли лучший способ определить, выполнена ли задача? Могу ли я заставить новый запрос дождаться завершения предыдущей задачи или отменить предыдущую задачу и начать новую. (Любой сценарий достаточен для нужд приложений, поскольку, как только пользователь нажимает на новый элемент, предыдущий элемент не имеет значения).
Приложены, по моему мнению, соответствующие фрагменты кода App.cs , ViewModel и Repo.
public partial class App : Application
{
public IServiceProvider serviceProvider { get; set; }
public App()
{
serviceProvider = CreateServiceProvider();
}
public new static App Current => (App)Application.Current;
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
}
private IServiceProvider CreateServiceProvider()
{
IServiceCollection services = new ServiceCollection();
services.AddDbContext(options => { options.UseSqlServer("defaultconnstring"); },ServiceLifetime.Transient);
services.AddTransient();
services.AddTransient();
return services.BuildServiceProvider();
}
}
public partial class ViewModel : ObservableObject
{
private ILocalRepo _localRepo;
private bool _taskcompleted = true;
[ObservableProperty]
private short ubCounter;
[ObservableProperty]
private short selectedCounter;
async partial void OnSelectedCounterChanged(short value)
{
await getSelectedResearch(value);
}
async partial void OnUbCounterChanged(short value)
{
await getSelectedResearch(value);
}
async internal Task getSelectedResearch(short value)
{
if (!_taskcompleted)
{
await Task.Delay(1500);
}
_taskcompleted = false;
SelectedResearch = await _localRepo.OneResearchbyCounter(value);
_taskcompleted = true;
}
public ResearchViewModelC1()
{
_localRepo = App.Current.serviceProvider.GetService();
}
}
public class LocalRepo : ILocalRepo
{
private readonly bardv2hContext _localdb;
public LocalRepo(bardv2hContext localdb)
{
_localdb = localdb;
}
public async Task OneResearchbyCounter(short counter)
{
var res = await _localdb.Researches.Where(r=>r.Counter == counter).Include(r=>r.Inres).Include(r=>r.ApprovedResearch).Include(r=>r.Actualpayments).
Include(r=>r.FiscalReports).Include(r=>r.Scireports).FirstOrDefaultAsync().ConfigureAwait(false);
return res;
}
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... -completed
Как определить, завершен ли предыдущий вызов задачи ⇐ C#
Место общения программистов C#
-
Anonymous
1729591704
Anonymous
У меня есть приложение .NET 8 wpf, которое использовало набор инструментов сообщества Microsoft для MVVM и внедрения зависимостей расширений Microsoft, а также платформу EF-Core. В дополнение к представлениям и моделям представлений у меня есть класс Repo, который использует асинхронные сообщения для запроса данных с помощью EF-Core.
Приложение создает представление списка, и пользователь щелкает элемент, что вызывает изменение свойства элемента. и вызывает асинхронный метод в репозитории, который извлекает запись из базы данных.
Проблема возникает, если пользователь выбирает новый элемент до того, как был получен предыдущий элемент (т. е. он щелкнул не тот элемент и хочет щелкнуть по нему). еще один). Я получаю сообщение об ошибке «Вторая операция была начата в этом экземпляре контекста до завершения предыдущей операции».
Я пробовал изменить контекст данных и области службы, но это не решило проблему. Давайте сохраним этот вопрос для другой темы.
В этом сценарии новый вызов асинхронного метода выполняется всякий раз, когда пользователь меняет выбранный элемент. Как я могу определить, был ли завершен предыдущий вызов, прежде чем выполнять новый вызов?
Решение, которое я реализовал, установив свойство внутри метода, которое определяет, завершена ли задача, работает, но есть ли лучший способ определить, выполнена ли задача? Могу ли я заставить новый запрос дождаться завершения предыдущей задачи или отменить предыдущую задачу и начать новую. (Любой сценарий достаточен для нужд приложений, поскольку, как только пользователь нажимает на новый элемент, предыдущий элемент не имеет значения).
Приложены, по моему мнению, соответствующие фрагменты кода App.cs , ViewModel и Repo.
public partial class App : Application
{
public IServiceProvider serviceProvider { get; set; }
public App()
{
serviceProvider = CreateServiceProvider();
}
public new static App Current => (App)Application.Current;
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
}
private IServiceProvider CreateServiceProvider()
{
IServiceCollection services = new ServiceCollection();
services.AddDbContext(options => { options.UseSqlServer("defaultconnstring"); },ServiceLifetime.Transient);
services.AddTransient();
services.AddTransient();
return services.BuildServiceProvider();
}
}
public partial class ViewModel : ObservableObject
{
private ILocalRepo _localRepo;
private bool _taskcompleted = true;
[ObservableProperty]
private short ubCounter;
[ObservableProperty]
private short selectedCounter;
async partial void OnSelectedCounterChanged(short value)
{
await getSelectedResearch(value);
}
async partial void OnUbCounterChanged(short value)
{
await getSelectedResearch(value);
}
async internal Task getSelectedResearch(short value)
{
if (!_taskcompleted)
{
await Task.Delay(1500);
}
_taskcompleted = false;
SelectedResearch = await _localRepo.OneResearchbyCounter(value);
_taskcompleted = true;
}
public ResearchViewModelC1()
{
_localRepo = App.Current.serviceProvider.GetService();
}
}
public class LocalRepo : ILocalRepo
{
private readonly bardv2hContext _localdb;
public LocalRepo(bardv2hContext localdb)
{
_localdb = localdb;
}
public async Task OneResearchbyCounter(short counter)
{
var res = await _localdb.Researches.Where(r=>r.Counter == counter).Include(r=>r.Inres).Include(r=>r.ApprovedResearch).Include(r=>r.Actualpayments).
Include(r=>r.FiscalReports).Include(r=>r.Scireports).FirstOrDefaultAsync().ConfigureAwait(false);
return res;
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79113510/how-to-determine-if-previous-call-to-task-is-completed[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия