2015-03-10 3 views
-1

Я написал бок о бок COM DLL на C#. Я использую эту DLL в VB6.Тема в SxS C# COM DLL делает вызывающее приложение невосприимчивым

COM DLL содержит нить. Как только я запускаю этот поток, вызывающее приложение (в моем случае VB6) блокирует (что означает, что я больше ничего не могу в нем).

Я начинаю нить вроде этого:

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 приходит от этого:

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

это нормально, что вызывающее приложение перестает отвечать на запросы? Я думал, что, поскольку это другая тема, это не сделало бы этого.

+1

** 1. ** Не уверен, поможет ли это, но поскольку вы имеете дело с COM здесь, может быть хорошей идеей явно установить состояние квартиры для созданного потока (перед его запуском) с помощью [ '_startMasterThread.SetApartmentState'] (https://msdn.microsoft.com/en-us/library/system.threading.thread.setapartmentstate.aspx" Справочная страница MSDN "). ** 2. ** (Не по теме :) DLL не может «содержать» поток; код в DLL может * создать * и/или * запустить * поток. – stakx

ответ

0

Похоже, вы создаете поток STA, а затем пренебрегаете обслуживанием насоса сообщений. Абоненты блокируются, потому что никто не отвечает на их сообщения. Следовательно, пользовательский интерфейс (вызывающий) зависает (блокируется).

Некоторые старые, но очень соответствующие статьи:

После прочтения этих, и понять проблему, решение (ы) будет очевидно. Переключитесь на MTA или запустите насос сообщений в своей нити.

+0

Я пробовал _startMasterThread.SetApartmentState (ApartmentState.STA); но это ничего не изменило. Вы имеете в виду, что я должен изменить DLL, чтобы быть MTA? Я не видел, где бы я мог установить эту настройку. – tmighty

Смежные вопросы