By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
457,733 Members | 889 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 457,733 IT Pros & Developers. It's quick & easy.

Single threaded class for COM interop

P: n/a
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.
Nov 18 '05 #1
Share this Question
Share on Google+
2 Replies


P: n/a
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" <ro**********@hotmail.com> wrote in message
news:ad*************************@posting.google.co m...
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.

Nov 18 '05 #2

P: n/a
Rob
Thanks Bruce.

"bruce barker" <no***********@safeco.com> wrote in message news:<#z**************@TK2MSFTNGP12.phx.gbl>...
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" <ro**********@hotmail.com> wrote in message
news:ad*************************@posting.google.co m...
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.

Nov 18 '05 #3

This discussion thread is closed

Replies have been disabled for this discussion.