Консольное приложение, которое основано на STA может задержать выпуск компонентов COM и может задержать вызовы методов Finalize для объектов, которые собирает сборщик мусора

Переводы статьи Переводы статьи
Код статьи: 828988 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

Проблема

Если консольное приложение, которое зависит от однопотокового апартамента (STA) создает и затем использует компоненты модели компонентных объектов (COM) STA и консольное приложение не выполняет достаточно операции COM сообщений, например при вызове Оспоренные метод, Метод Thread.Join метод и другими пользователями, могут возникнуть следующие неполадки. Кроме того если консольное приложение выполняет операции, которые выполняются в течение длительного времени и что они не насос сообщений, например при вызове Console.ReadLine метод, могут возникнуть следующие неполадки:
  • Выпуск COM-компоненты могут задержки.
  • Вызовы Заключительное уточнение методы объектов что позволяет собрать сборщик мусора может быть отложена.
  • Вызовы компонентов COM может блокировать поток приложения для продолжительного времени.
  • Сумма памяти, которая использует процесс приложения STA может увеличиться по сравнению с время.
  • Вызовы СБОРЩИК МУСОРА.WaitForPendingFinalizers метод может занять длительное время.

Причина

Для доставки вызова компонента STA COM правильно, вызов освободить компонент, в том числе потоке, где был создан компонент должен обработка сообщений. Когда управляемый код больше не ссылается на компонент COM, необходимо в потоке метода завершения вызов Выпуск метод компонента. Однако если STA-потока where был создан компонент является не обработка сообщений, вызов блокируется приложение до поток запускается обработка сообщений снова. Некоторые приложения создают много COM-компонентов и объектов, которые могут быть завершены. В этих приложениях Если финализатор поток тратит много времени, заблокировать, пока он ожидает STA поток сообщений, поток завершения не сможет завершить его действие. Список COM компоненты для выпуска и список управляемых объектов для окончательного может расти до бесконечности. При возникновении этой проблемы со временем может увеличить сумму памяти, которая использует процесс приложения STA. Кроме того, любой поток, вызывающий СБОРЩИК МУСОРА.WaitForPendingFinalizers метод может блокироваться неопределенное время.

Файл и консольного ввода/вывода операции (IO) операционной системы, таких как ReadFile и WriteFile, не отображению сообщений. Так как Console.ReadLine использует API ReadFile операционной системы Console.ReadLine не насоса либо сообщений. Таким образом любой поток, вызывающий Console.ReadLine не отображению сообщений во время вызова.

Решение

Чтобы устранить эту проблему, используйте потоки MTA вместо потоков STA создать и установить связь с Компоненты COM в консольных приложениях. Можно задать основной поток приложения для агента передачи сообщений. Для этого применяются System.MTAThreadдля атрибута основной метод следующим образом:
public class ConsoleApplication
             {
                 [MTAThread]
                 static void Main()
                 {
                     // Add your code here.
                     Console.ReadLine();
                 }
} 
При использовании потоков STA создавать компоненты COM, необходимо насос потоков STA регулярно сообщения. Для получения сообщений на короткое время вызова очередь Метод Thread.Join метод выглядит следующим образом:
Thread.CurrentThread.Join(100)
Этот метод вызывается прокачкам сообщений на 100 миллисекунд. Можно настроить время ожидания, в зависимости от требований приложения. Кроме того STA поток никогда не будет выполнять неограниченные-накачки такие операции, как вызов Console.ReadLine. Вместо этого STA-потока необходимо выполнение потока MTA Операция и затем ожидать завершения операции.

Ссылки


Для получения дополнительных сведений о программе.NET Framework удаленного взаимодействия, посетите следующий веб-узел корпорации Майкрософт:
http://msdn2.Microsoft.com/en-us/library/1912sb9w (vs.71) .aspx
Для Дополнительные сведения о сборке мусора в.NET Framework, посетите следующие веб-узлы корпорации Майкрософт:
http://MSDN.Microsoft.com/msdnmag/issues/1100/gci/
http://MSDN.Microsoft.com/msdnmag/issues/1200/GCI2/

Для получения дополнительных сведений о блокировке вызовы из компонент STA щелкните следующий номер статьи базы знаний Майкрософт:
291837ИНФОРМАЦИЯ: Не применяйте блокирующих вызовов из компонент STA

Свойства

Код статьи: 828988 - Последний отзыв: 15 июня 2011 г. - Revision: 4.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft .NET Framework 1.1
  • Microsoft .NET Framework 1.0
Ключевые слова: 
kbgarbagecollect kbremoting kbprb kbmt KB828988 KbMtru
Переведено с помощью машинного перевода
ВНИМАНИЕ! Перевод данной статьи был выполнен не человеком, а с помощью программы машинного перевода, разработанной корпорацией Майкрософт. Корпорация Майкрософт предлагает вам статьи, переведенные как людьми, так и средствами машинного перевода, чтобы у вас была возможность ознакомиться со статьями базы знаний KB на родном языке. Однако машинный перевод не всегда идеален. Он может содержать смысловые, синтаксические и грамматические ошибки, подобно тому как иностранец делает ошибки, пытаясь говорить на вашем языке. Корпорация Майкрософт не несет ответственности за неточности, ошибки и возможный ущерб, причиненный в результате неправильного перевода или его использования. Корпорация Майкрософт также часто обновляет средства машинного перевода.
Эта статья на английском языке:828988

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com