Hi Steve,
I am looking into this now, because we can't force a connection to close - Cancel() doesn't really do much, and Dispose() does not dispose of the network connection immediately, we have to wait until the current store or operation is completed..
Anyway, reading over the thread - I agree we should make a proper Abort() method w/ at first trying to send a dicom associate abort - perhaps this can replace the existing Cancel() method.
What I believe is preventing a Scu to dispose/abort properly, is NetworkBase.ShutdownNetworkThread() - the _thread.Join() waits until the current dicom store is finished .. so, if I change it to say _thread.Join(2500), then it will close... although, could create threading issues like you mentioned before...
anyway, attached is a attempt at this.. note, in DicomClient.Abort() - probably want to do some checks before calling SendAssociateAbort() to make sure it is in a valid state to do it...
thanks,
dan