Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Замечание
Эта статья относится к .NET Framework. Он не применяется к более новым реализациям .NET, включая .NET 6 и более поздние версии.
Помощник по управляемой invalidApartmentStateChange отладке (MDS) активируется двумя проблемами:
Предпринята попытка изменить состояние com-квартиры потока, который уже инициализирован COM на другое состояние квартиры.
Состояние com-квартиры потока неожиданно изменяется.
Симптомы
Состояние com-квартиры потока не является запрошенным. Это может привести к тому, что прокси-серверы будут использоваться для com-компонентов с моделью потоков, отличной от текущей. Это, в свою очередь, может вызвать InvalidCastException исключение при вызове COM-объекта через интерфейсы, которые не настроены для маршаллинга между квартирами.
Состояние com-квартиры потока отличается от ожидаемого. Это может привести COMException к возникновению RPC_E_WRONG_THREAD HRESULT, а также InvalidCastException при вызове вызываемого оболочки среды выполнения (RCW). Это также может привести к тому, что некоторые однопоточные com-компоненты могут получать доступ к нескольким потокам одновременно, что может привести к повреждению или потере данных.
Причина
Поток был ранее инициализирован в другом состоянии com-квартиры. Обратите внимание, что состояние квартиры потока можно задать явно или неявно. Явные операции включают Thread.ApartmentState свойство и SetApartmentStateTrySetApartmentState методы. Поток, созданный с помощью Start метода, неявно устанавливается MTA , если SetApartmentState не вызывается до запуска потока. Основной поток приложения также неявно инициализирован, MTA если STAThreadAttribute атрибут не указан в основном методе.
Метод
CoUninitialize(илиCoInitializeExметод) с другой моделью параллелизма вызывается в потоке.
Резолюция
Задайте состояние квартиры потока перед началом выполнения или примените STAThreadAttribute атрибут или MTAThreadAttribute атрибут к основному методу приложения.
Во-вторых, в идеале код, CoUninitialize вызывающий метод, должен быть изменен, чтобы отложить вызов, пока поток не завершится, и их базовые com-компоненты по-прежнему используются потоком. Однако если невозможно изменить код, вызывающий CoUninitialize метод, то никакие RCW не должны использоваться из потоков, которые не инициализированы таким образом.
Влияние на среду выполнения
Этот MDA не влияет на среду CLR.
Выходные данные
Состояние com-квартиры текущего потока и состояние, которое код пытается применить.
Конфигурация
<mdaConfig>
<assistants>
<invalidApartmentStateChange />
</assistants>
</mdaConfig>
Пример
В следующем примере кода показана ситуация, которая может активировать этот MDA.
using System.Threading;
namespace ApartmentStateMDA
{
class Program
{
static void Main(string[] args)
{
Thread.CurrentThread.SetApartmentState(ApartmentState.STA);
}
}
}