Ciao Laura,
per supportare la cancellazione di operazioni di lunga durata è utile usare l'oggetto CancellationTokenSource che vedremo adesso.
Nell'evento scroll change se presumo che lo scroll è fermo faccio partire un loop sulle righe che sto visualizzando al momento e per ognuna faccio partire un Task per la lettura:
Ok, potresti mettere il loop in un proprio metodo asincrono che richiami dal gestore dell'evento ScrollChanged. Puoi anche non usare l'await in quell'invocazione, tanto non ci interessa attenderne il completamento. Ci interessa invece cancellare l'eventuale esecuzione precedente e questo lo fai per mezzo di un CancellationTokenSource.
Ad ogni iterazione del loop, verifica se è stata richiesta o no la cancellazione. Se è stata richiesta, esci dal loop ed eventualmente interrompi l'esecuzione dell'operazione corrente.
Per interrompere l'esecuzione dell'operazione corrente, è necessario però che tu stia usando un'operazione asincrona che supporti il CancellationTokenSource. Per esempio, se accedi al db Sqlite usando il pacchetto
Microsoft.Data.Sqlite, hai il metodo ExecuteReaderAsync che lo supporta. Eccolo nel sorgente:
https://github.com/aspnet/Microsoft.Data.Sqlite/blob/dev/src/Microsoft.Data.Sqlite.Core/SqliteCommand.cs#L422
GetArticoloListaAllDato
Questa dovrebbe essere asincrona ed accettare il CancellationToken, altrimenti non riuscirai a cancellarla. Se non riesci a renderla asincrona, pazienza. Vuol dire che l'interruzione avverrà appena questa si è completata.
Per farti capire meglio, ti condivido un'app dimostrativa a questo indirizzo:
https://1drv.ms/u/s!Ao4rhSdtDw8rgelKn_1ukS-t2uAenAIo non ho i controlli di SyncFusion quindi ho dovuto usare una normale ListView. Guarda in particolar modo la view MainPage.xaml (e il suo codefile) dove ho messo la ListView e la gestione dei suoi eventi ItemAppearing e ItemDisappearing. Ho dovuto usare questi al posto di ScrollChanged perché nella ListView di Xamarin.Forms non c'è. Comunque è un approccio equivalente al tuo: ho anch'io una lista ma la tengo aggiornata ogni volta che un elemento appare o scompare.
La logica "interessante" è nella classe MainPageViewModel dove trovi un timer che invoca il metodo LoadAdditionalInfo se sono trascorsi più di 500 millisecondi dall'ultimo movimento.
Questa funzione (LoadAdditionalInfo, in cui si trova il loop) passa in rassegna la lista degli oggetti visibili e, per ciascuno, carica i dati aggiuntivi. Il caricamento viene subito interrotto se l'utente ricomincia a scrollare, quindi lo scroll risulterà immediatamente fluido.
ciao,
Moreno