2015-03-10 1 views
-1

J'ai écrit une DLL COM côte à côte en C#. J'utilise cette DLL en VB6.Thread dans SxS C# DLL DLL rend l'application appelante non répondante

La DLL COM contient un thread. Dès que je démarre ce thread, l'application appelante (dans mon cas VB6) se bloque (ce qui signifie que je ne peux plus rien y faire).

Je commence le fil comme celui-ci:

private Thread _startMasterThread; 

    public void Init() 
    { 
     if (_startMasterThread == null) 
     { 
      _startMasterThread = new Thread(new ThreadStart(pMasterThread)); 
      _startMasterThread.Priority = ThreadPriority.Highest; 
      _startMasterThread.Start(); 
     } 
    } 

    private void pMasterThread() 
    { 
     while (!_bAbortAll) 
     { 
      //do something 
     } 
    } 

ThreadStart vient de ceci:

namespace System.Threading 
{ 
    [ComVisible(true)] 
    public delegate void ThreadStart(); 
} 

Est-il normal que l'application appelante ne répond plus? Je pensais que puisque c'est un fil différent, il ne le ferait pas.

+1

** 1. ** Vous ne savez pas si cela vous aidera, mais comme vous avez affaire à COM ici, il peut être judicieux de définir explicitement l'état de l'appartement pour le thread créé (avant de le démarrer) via [ '_startMasterThread.SetApartmentState'] (https://msdn.microsoft.com/en-us/library/system.threading.thread.setapartmentstate.aspx" page de référence MSDN "). ** 2. ** (Hors sujet :) Une DLL ne peut pas "contenir" un thread; le code dans la DLL peut * créer * et/ou * démarrer * un thread. – stakx

Répondre

0

Il semble que vous créez un thread STA, puis négligez de servir la pompe de message. Les appelants vont bloquer parce que personne ne répond à leurs messages. Par conséquent, l'interface utilisateur (un appelant) se bloque (bloc).

Quelques anciens, mais des articles très pertinents:

Après avoir lu ces derniers, et de comprendre la question, la solution (s) sera évident. Passez à un MTA ou exécutez une pompe de message dans votre thread.

+0

J'ai essayé _startMasterThread.SetApartmentState (ApartmentState.STA); mais cela n'a rien changé. Voulez-vous dire que je devrais changer la DLL pour être MTA? Je n'ai pas vu où je pouvais régler ce paramètre. – tmighty