Good questions, lemme throw in some more background.
I'm working on a WinForms user control, and the "server" object is a 3rd party wrapper for a WebService object. At some point, the server may timeout, and any further calls on the same server object will fail.
As for race conditions, that is a danger, but I'm combatting that by wrapping calls to the server object in locks on the server object itself. I'm only ever making one call to the server at a time (typically to get a bit of binary data), and I don't have to
send any updates to the server, so I don't have to worry about inconsistent state.
It's outside the realm of my control to replace the server object. I *may* be able to repair the object, but if the server requires a new login, I don't have the user's password. So it would be good if I simply responsibly reported a failure and let the application
handle the cleanup.
Yesterday, I implemented a simple wrapper object for the server object to share it as necessary. I think this is the solution I'll stick with.