I think your issues are involved in your Threading.. Most likely tied into the Disposal... check to see which objects are actually getting disposed of... It sounds like your dispose is being called oin the wrong object from a different thread...
Use the pattern
class myThreadWorkerClass :System.Threading.Thread
{
}
I find this helps to keep me in the mindset that i am declaring memory on this perticular thread, and it also helps with cross thread problems...
hope that it is helpfull
(yes I know it has been a while since this thread was "active" :~)