2010-09-10 3 views
2

У меня многопоточное приложение, использующее .NET 4.0. Иногда это приложение COM ссылалось на фриков и просто останавливалось.Как определить, запущено ли приложение COM?

Я хочу знать, как проверить, проверен ли этот процесс в вопросительной цепочке.

Пример:
Exert от основного приложения:

ThreadedApp app = new ThreadedApp(); 
System.Threading.Thread thread = new System.Threading.Thread(x => app.Start()); 
thread.Start(); 

Бизнес-объект оказывают:

class ThreadApp 
{ 
    public void Start() 
    { 
     COMobject app = new COMobject(); // <- COM interop that starts up the COM app 
     foreach (var item in items) 
     { 
      new ThreadProcess().Process(ref app, item); 
     } 
    } 
} 
class ThreadProcess 
{ 
    public void Process(ref COMobject app, SomeItem item) 
    { 
     if (app == IVE_DIED_AND_I_DONT_KNOW_WHY) // How do I check this? 
     { 
      app = new COMobject(); 
     } 
     // Process stuff 
    } 
} 

Основное приложение может закрутить N число потоков и, следовательно, может закрутить N число приложение COMobject. Если вы посмотрите Диспетчер задач, вы увидите, что COMobject.exe указан для каждого потока.

Я пытаюсь уйти от блоков try/catch для повышения производительности, но не знаю, как проверить состояние COM-приложения из вызывающего потока.

Надеюсь, это имеет смысл и TIA.

+0

Вы имеете в виду COM +? –

+0

Да COM + объект/приложение ... –

ответ

2

Попробуйте/поймайте все, что у вас есть. Попробуйте бесплатно, только улов стоит дорого. Не имеет значения.

В целом, будьте очень осторожны, смешивая COM-объекты и нити. Подавляющее большинство из них не поддерживают бесплатную резьбу. Выполнение этого в любом случае покупает вас именно такую ​​проблему, с которой вы сталкиваетесь.

+0

Достаточно честный. У меня было ощущение, что это застрянет. Приложение работает как ожидалось, я просто пытаюсь сделать его быстрее. К сожалению, у меня нет выбора, кроме как использовать этот COM-объект в этом стиле. Благодарю. –

+0

Это очень, очень неразумно. Вы не знаете, в каком состоянии находится ваша программа, когда компонент взрывается. Типичный режим отказа - поврежденная куча, не может ее поймать и исправить. Ну удачи –

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