See the question and my original answer on StackOverflow

So, you're sending a "raw" COM interface ('this') to code in another thread. That's probably why you get the error.

COM interface pointers must be passed using COM methods (as arguments to the method so COM knows it has to marshal it to another thread/apartment), not by other means. When in apartment model, you think of it like every COM object lives in each own process (you can't use 'this' in another process, and that's the same rule for apartments).

You could use "COM Connection points" (see here + google for some explanations: An introduction to COM connection points) which are like events between COM objects. Note this can be complicated.

You could also use more low-level constructs and marshal interface pointers yourself (using the CoMarshalInterThreadInterfaceInStream function). See another article on this here: What are the rules for CoMarshalInterThreadInterfaceInStream and CoGetInterfaceAndReleaseStream?. I would try that first.