It is hard to tell what is happening for sure. But this sounds like you are instantiating a COM object and then trying to use it in another thread.
Part of the problem here is you SHOULD be using those object locally. It is actually best to use those object in a
using
statement.
If you are writing a Data Access Layer the only thing that should be 'global' is the connection to the database. You don't want to open and close the connection constantly. You do however only want to use a SqlCommand/SqlDataReader pretty quickly and for a specific purpose, then you want to get rid of (Dispose) it.