Yes, the code as uploaded does create a new SNTPClient instance each time. That works out ok for a low volume operation like making an SNTP time query.
But there is other code there, most of it commented out, that is from my first attempt where I declared a module-global instance and reused it.
I agree that the test-and-close line of code does nothing and can be removed, being merely left over from some experimentation. I plan to re-post a cleaned up version once I know what is going on with UDPSocket.Close, because people tend to take examples and copy/paste them into future applications.
What it seems to boil down to is that UDPSocket.Close always throws an exception. Calling Close would seem to be the obvious way to free resources when you no longer need them, to be followed by a new Initialize call later on (possibly using a different remote host, etc.). Discarding the old instance and later creating a new instance works, but that seems like overkill and extra overhead for most applications.
So I'm wondering whether this is true and a bug, or a usage error on my part.