Single threaded class for COM interop

R

Rob

Hi.

I'm having difficulty calling a 3rd party COM object that must be
called in the apartment (single) threaded model. As far as I know,
there are 3 ways todo this:

1 - use "aspcompat=true" for aspx pages
2 - use [STAThread] attribute for windows/console applications
3 - use System.Thread.CurrentThread.ApartmentState =
ApartmentState.STA

The problem is that the COM object is only called through a business
layer module. This business layer consists of a number of classes that
encapsulate the calls to the COM object. Therefore, option 1 and 2 are
not applicable and option 3 does not work since the threading model
has already been defined even before the class initializer is called.

One solution that I've come up with is calling a 'stub' method for
each method in the business layer. This 'stub' will declare a new
thread, set the apartment model to STA, then start the thread. This is
tedious because every method will require a 'stub' and all parameters
(in and out) must be handled through private class members. I can't
imagine that this is the proper way of doing things.

So, my question is: Is there a way to make the entire class
single-threaded by default (similar to [STAThread] for a windows app)?

Any help would be greatly appreciated.

Rob.
 
B

bruce barker

no, if a class is not thread safe, it has no way of enforcing it, it up to
the caller. the 3 methods you list are for ensuring the caller (a thread)
does not do a thread switch.

your solution is the correct one, except, that the stubs should only create
one STA thread, then switch to that thread to make the call, unless the com
object is completly stateless.

-- bruce (sqlwork.com)
 
R

Rob

Thanks Bruce.

bruce barker said:
no, if a class is not thread safe, it has no way of enforcing it, it up to
the caller. the 3 methods you list are for ensuring the caller (a thread)
does not do a thread switch.

your solution is the correct one, except, that the stubs should only create
one STA thread, then switch to that thread to make the call, unless the com
object is completly stateless.

-- bruce (sqlwork.com)


Rob said:
Hi.

I'm having difficulty calling a 3rd party COM object that must be
called in the apartment (single) threaded model. As far as I know,
there are 3 ways todo this:

1 - use "aspcompat=true" for aspx pages
2 - use [STAThread] attribute for windows/console applications
3 - use System.Thread.CurrentThread.ApartmentState =
ApartmentState.STA

The problem is that the COM object is only called through a business
layer module. This business layer consists of a number of classes that
encapsulate the calls to the COM object. Therefore, option 1 and 2 are
not applicable and option 3 does not work since the threading model
has already been defined even before the class initializer is called.

One solution that I've come up with is calling a 'stub' method for
each method in the business layer. This 'stub' will declare a new
thread, set the apartment model to STA, then start the thread. This is
tedious because every method will require a 'stub' and all parameters
(in and out) must be handled through private class members. I can't
imagine that this is the proper way of doing things.

So, my question is: Is there a way to make the entire class
single-threaded by default (similar to [STAThread] for a windows app)?

Any help would be greatly appreciated.

Rob.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top