There are different ways how to do that. The way that works best for me is to set the Notification Handle to a Toggle Bit in the PLC (port 851 TC3), maybe something like this:
// tic for ADS notification, imod used for cycle adjustment
diCounter := diCounter + 1;
IF (diCounter MOD imod = 0)
THEN
bTic := NOT bTic;
END_IF

The notification handle is a good realtime tic for getting data into C#.
This works fine down to a 10ms cycle if TwinCAT runs on a isolated core. On Beckhoff Controllers this communication into a user mode application is stable down to 1ms. At least that is my experience regarding deterministic real time hardware.
Now the notification is cyclically arriving in C#, with this signal an ADS sum Command can be used to get multiple Variables in one Request. This is also highly recommended in order to keep the communication overhead low.
TC3 ADS SUM Commands .NET example:
https://infosys.beckhoff.de/english.php?content=../content/1033/tc3_adssamples_net/185258507.html&id=8424732030635156090