У меня есть класс, который отвечает за рендеринг записей сетки.Отменить предыдущий вызов асинхронного вызова и утилизировать используемые ресурсы
ObservableCollection<Dictionary<string, string>> gridData;
ObservableCollection<Dictionary<string, string>> GridData;
{
get
{
return gridData;
}
set
{
this.gridData = value;
NotifyPropertyChanged();
}
}
Вышеуказанное свойство привязано к GridControl (Devexpress WPF).
Ниже представлен асинхронный метод, который отвечает за визуализацию данных из задней службы.
public async void RefresRecords()
{
await GetRecords();
}
private async Task GetRecords()
{
int offset = 0;
int limit = 50;
do
{
var dummyData = await GetRangeRecord(offset, limit);
GridData.Add(dummyData);
offset += limit;
} while (GridData.Count() < 1000);
}
private Task<Dictionary<string, string>> GetRangeRecord(int offset, int limit)
{
// This method does processing and returns records from offset to limit
return new Task<Dictionary<string, string>>();
}
От задней службы может быть огромное количество данных, но я хочу показать только 1000 записей.
Записи будут отобраны в куске по 50 записей за звонок. Когда свойство привязано, пользовательский интерфейс будет обновляться одновременно.
Теперь рассмотрим случай использования, как показано ниже: -
Шаг 1: - Вызов приходит метод ASYN "RefresRecords". Предположим, что из бэкэнд-сервиса выдается 1000 записей. Таким образом, этот метод будет зацикливаться 20 раз и отобразит 50 записей на вызов службы.
Этап 2: - Пока шажок 1 находится в процессе, так как он является асинхронным, другой вызов приходит для одного и того же метода асинхронизации «RefreshRecords».
Результат: - После шага 2 сетка будет загружена данными из извлеченных данных этапа 2, а также некоторой частью шага 1, поскольку одно и то же свойство изменяется в двух последующих вызовах метода asyn.
Вопрос: - Каков наилучший способ полностью остановить Step1, когда есть новый вызов для того же метода.
Либо использовать 'CancellationToken', чтобы позволить первый вызов будет отменен или отключить дубликат операции, чтобы предотвратить его от вмешательства (например, отключить любую часть пользовательского интерфейса вызывает это произойдет, просто игнорировать его, если требуется, поставите его так, чтобы он начинался только после первого окончания и т. д.).К сожалению, я не могу сказать, что вопрос включает достаточно контекста, чтобы знать, какой из этих вариантов может быть предпочтительным в вашем случае. Здесь много вариантов. –