2010-12-13 6 views
5

Si j'ai un thread STA dans .NET et que je crée un objet COM STA dans ce thread, puis le thread finit - est-ce que cela tue cette instance de l'objet?COM Interop .NET STA

Est-ce que ma compréhension correcte que les objets STA COM peuvent être accessibles par plusieurs threads et runtime va automatiquement marshal les appels à tous arriver dans le thread appartement? Est-ce thread le thread qui a créé l'instance? Donc, si ce thread se termine, l'instance est orpheline et perdue? Ou existe-t-il un thread séparé créé pour les instances STA?
Comment cela se déroule dans ASP.Net avec ASPCompat = True? Ma compréhension est que chaque demande est traitée par un thread de travail aléatoire, et si mon composant STA est placé dans la session, va-t-il mourir aléatoirement parce que le thread de traitement de la demande qui l'a créé pourrait avoir fini?

Répondre

5

Si vous créez votre objet COM STA sur un thread .NET STA, tous les appels à votre objet sont rassemblés sur ce thread.

Si vous créez votre objet STA COM sur un thread MTA .NET, le moteur d'exécution créera un thread STA et dirigera tous les appels vers ce thread. Ainsi, lorsque votre thread (STA) existe, vos objets COM sont inaccessibles.

Une solution pourrait être de créer les objets sur un nouveau thread pour lequel vous pouvez contrôler la durée de vie.

Je l'ai fait une chose semblable comme ça:

using (ManualResetEventSlim mre = new ManualResetEventSlim(false)) 
{ 
    Thread _STAThread = new Thread(new ThreadStart(() => 
       { 
        globalComObject = new ComClass(); 
        mre.Set(); 
        try 
        { 
         Thread.CurrentThread.Join(); 
        } 
        catch (ThreadAbortException) 
        { 
        } 
       })); 
       _STAThread.SetApartmentState(ApartmentState.STA); 
       _STAThread.IsBackground = true; 
       _STAThread.Start(); 
       mre.Wait(); 
} 

Le code commence un nouveau thread, mettre l'appartement à STA et attend la création d'un objet COM sur ce thread. Le thread lui-même est en cours d'exécution jusqu'à ce que votre application se ferme (IsBackground = true) ou vous supprimez le thread explicitement avec Thread.Abort(). Mais gardez à l'esprit que tous les appels à vos objets COM sont rassemblés et ainsi exécutés en série l'un après l'autre sur ce même thread. Cela pourrait être un gros goulot d'étranglement dans votre application. ASPCompat = true indique à l'environnement d'exécution ASP.NET que vous utilisez des objets COM STA et exécute ainsi la page dans un thread STA. sinon vous migth obtenez une exception ou tous vos objets COM courrez dans le thread STA généré automatiquement partagé par toutes demandes de votre page (voir MSDN ici: http://msdn.microsoft.com/en-us/library/zwk9h2kb(VS.80).aspx)

+0

Donc, cela veut dire que si j'utilise ASPCompat et mettre COM objets dans la session, ils vont mourir au hasard parce que le fil qui les a créés aura fini ?? –

+1

Je pense que non, car ASP.NET utilise un pool de threads pour gérer les requêtes. Les threads ne "mourront" pas après le traitement d'une requête. Consultez ces articles de la base de connaissances dans lesquels Microsoft indique qu'il est possible de stocker des objets COM STA dans l'état de session, mais recommande de ne pas y accéder: http://support.microsoft.com/kb/243543/fr-fr, http://support.microsoft .com/kb/243815/fr-fr – Jan

Questions connexes