As I understand it, Interlocked is only guaranteed when accessed by other Interlocked methods. This may be especially important when talking about 64-bit values on x86 systems, where it cannot be guaranteed to be atomic, so torn values are a concern. A good trick for robustly reading a value that can be changed by Interlocked is CompareExchange:
int val = Interlocked.CompareExchange(ref field, 0, 0);
This mutates the value of field
to 0, but only if the old value was 0 - otherwise it does nothing. Either way the old value is returned. So basically: it reads the value without ever changing it, and is safe vs other Interlocked methods.