The Sleep function will return from the sub at the point it's called, so all subsequent subs will be run at that time. When the Sleep is resumed all the other process (including the enable buttons) will have run. So if you are accessing the list after the sleep, it may well have been altered. See the simple example attached.
Thank you very much for your time, and your answer!
I've tried your example and I see potential trouble there. I should add some Wait For between DoStuffX. However, this is not what it's happening; most likely otherwise.
For example; DoStuff2 loads a Global list with 4 items (always 4). DoStuff3 uses that list and clears it at the end. When the exception is raised at DoStuff3 is because the list has 12 items. Debug logs seems to confirm DoStuff2 is executed 3 times before DoStuff3 ends.
I think I've traced the problem to a text update issue.
In fact, in my code, Button1_Click shares the same logic with a (modified)
AutoTextSizeLabel. So, ALabel1_Click does the same that Button1_Click (and it's also disabled an re-enabled). Since both controls are close (over?) to each other I don't really know which one I was compulsively clicking. DoStuff1 changes the text of ALabel1, which fires SetText method, that uses StringUtils.MeasureMultilineTextHeight and MeasureStringWidth (maybe there are some async calls there?).
I don't know why, but if I remove the ALabel1_Click event, the issue stops happening.
Changing the text of this control could be, briefly, re-enabling it?
Maybe setting the text is calling some async stuff?
Anyway, although not being the cause of my problem, your suggestion pointed me to a future problem I can solve before it happened, thank you very much!!!