REFRESH causes a control to redraw itself immediately... as in it interrupts the current flow to call its PAINT method (which may be internal, or maybe public [in the case of a Canvas])
INVALIDATE marks the control as NEEDING to be REFRESHED, and the system will do it as soon as it can, usually when the current loop or process completes.
For example.
for i=1 to 100
<do some stuff>
canvas1.refresh ' FORCED REFRESH
next i
compared to
for i=1 to 100
<do some stuff>
canvas1.invalidate
next i
....... <---- system will fire the paint event here automatically
For the users perspective both will VISUALLY be identical.... but the first will take longer to run, because it is redrawing the canvas 99 times that the user will never notice.
Obviously there are time where you need to use REFRESH to force an on going animation for example.... but 99% of the time INVALIDATE will make you code faster....