CLR не мог перейти от контекста COM […] в течение 60 секунд

Я получаю эту ошибку на коде, который раньше работал. Я не изменил код.

Вот полная ошибка:

CLR не мог перейти от контекста COM 0x3322d98 к контексту COM 0x3322f08 в течение 60 секунд. Поток, который владеет целевым контекстом/квартирой, скорее всего, или делает, не нагнетание ожидают или обработка очень длинной рабочей операции, не качая сообщения Windows. Эта ситуация обычно оказывает отрицательное влияние производительности и может даже привести к становлению приложения не быстро реагирующее или использование памяти, накапливающееся постоянно со временем. Для предотвращения этой проблемы все потоки единственной потоковой квартиры (STA) должны использовать нагнетание, ожидают примитивы (такие как CoWaitForMultipleHandles) и обычно качают сообщения во время длительных операций.

И вот код, который вызвал его:

var openFileDialog1 = new System.Windows.Forms.OpenFileDialog();
openFileDialog1.DefaultExt = "mdb";
openFileDialog1.Filter = "Management Database (manage.mdb)|manage.mdb";

//Stalls indefinitely on the following line, then gives the CLR error
//one minute later.  The dialog never opens.
if(openFileDialog1.ShowDialog() == DialogResult.OK)
{
    ....
}

Да, я уверен, что диалоговое окно не открыто в фоновом режиме, и не, у меня нет явного кода COM или неуправляемого маршалинга или многопоточности.

Я понятия не имею, почему OpenFileDialog не откроется - никакие идеи?

38
задан BlueRaja - Danny Pflughoeft 30 April 2010 в 21:52
поделиться

2 ответа

Разобрался - он автоматически переносит вас в последнее место, куда вы смотрели, каждый раз, когда открывается диалоговое окно. Если это местоположение в сети, которое больше не существует (например, другой компьютер выключен), оно просто зависнет навсегда.

Мое обходное решение выглядит следующим образом:

string initialDirectory = ...; //Figure out an initial directory from somewhere
openFileDialog1.InitialDirectory = !Directory.Exists(initialDirectory)
                                       ? Path.GetPathRoot(Environment.SystemDirectory)
                                       : initialDirectory;
14
ответ дан 27 November 2019 в 03:50
поделиться

Итак, он жалуется на контекст COM, даже несмотря на то, что вы явно не используете COM, потому что открываете диалоговое окно собственной оболочки под всем этим прекрасным кодом C # и оболочка использует COM.

Это сообщение говорит вам о том, что все, что он пытается сделать, он делает в потоке пользовательского интерфейса, а не лучшим образом, и, похоже, на это уходит много времени.Очевидно, что все, что не так, не является вашей ошибкой как таковой, поэтому вы можете игнорировать большинство советов, которые она вам дает.

Что стоит попробовать:

  1. Сначала я бы попробовал, как предлагает AaronLS , максимально упростить ваш openFileDialog . Попробуйте ничего не настраивать; просто создайте нового парня и вызовите ShowDialog () . Если это решит проблему, значит, вы только что задали ему неверные параметры, и мы можем поговорить о последствиях этого. Однако, если это не сработает, это означает, что что-то не так с землей из ракушек.

  2. Одна из возможных причин этого может заключаться в том, что у вас установлено расширение оболочки, которое делает что-то плохое. Лучше всего для вас сделать взлом (я думаю, ctrl + break в Visual Studio или debug-> break all в строке меню) и получить полный стек для нас. Мы должны быть в состоянии идентифицировать виновника, увидев, кто находится в стеке, когда появится диалоговое окно.

12
ответ дан 27 November 2019 в 03:50
поделиться