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.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" <robsomething@.hotmail.com> wrote in message
news:ad1c30ac.0407130636.35f7bda@.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.
Thanks Bruce.
"bruce barker" <nospam_brubar@.safeco.com> wrote in message news:<#zbX5JPaEHA.3244@.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" <robsomething@.hotmail.com> wrote in message
> news:ad1c30ac.0407130636.35f7bda@.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.
0 comments:
Post a Comment