DisconnectedContext был обнаружен при использовании ManagementObjectSearcher - PullRequest
3 голосов
/ 14 апреля 2011

Я использую следующую функцию в переопределении WndProc:

Public Function GetPortName() As String
    Dim portNameData As String
    Dim comPortNumber As String

    Try
        Dim portSearcher As New ManagementObjectSearcher("\root\CIMV2", "Select Name, PNPDeviceID from Win32_PnPEntity")
        For Each port As System.Management.ManagementObject In portSearcher.Get()

            If port("Name").ToString.ToUpper.Contains("(COM") Then
                portNameData = port("Name").ToString
                comPortNumber = port("Name").ToString.Substring(port("Name").ToString.IndexOf("(COM") + 4)
                comPortNumber = comPortNumber.TrimEnd(")"c)
                If port("PNPDeviceID").ToString.ToUpper.StartsWith("USB\VID_1234&PID_1234") Then
                    Return "COM" & comPortNumber
                End If
            End If
        Next
    Catch ex As Exception
    End Try

    Return ""
End Function

Функция работает нормально, но теперь я использую ее в новом приложении из формы. На каждой итерации цикла For (в строке For Each port As System...) я получаю это сообщение:

Обнаружен DisconnectedContext

Контекст 0x607fd8 отключен. Прокси-сервер не будет использоваться для обслуживания запроса в компоненте COM. Это может привести к повреждению или потере данных. Чтобы избежать этой проблемы, убедитесь, что все контексты / апартаменты остаются живыми до тех пор, пока приложение не будет полностью завершено с RuntimeCallableWrappers, которые представляют COM-компоненты, которые живут внутри них.

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


Я нашел пост на MSDN, в котором описана очень похожая проблема . Парень говорит:

Извините, не тратьте свое время. Код работает нормально, когда он запускается в простом консольном приложении. Проблема возникла, когда он вызывался в форме Windows, отвечающей на DriveDetectorEvent.

Я бы хотел выяснить, что отличается в приложении Forms.


Редактирование и возможное решение: На основе ответа в DisconnectedContext MDA при вызове функций WMI в однопоточном приложении Я думаю, что решение здесь состоит в том, чтобы вызвать GetPortName() вне WndProc , Я проверю это сегодня вечером и опубликую свой результат.

1 Ответ

4 голосов
/ 22 апреля 2011

После прочтения ответа в DisconnectedContext MDA при вызове функций WMI в однопоточном приложении кажется, что мой код не работает, потому что он вызывается из WndProc, блокируя WndProc.Это вызывает проблемы, поскольку маршалинг требует прокачки сообщений ... но я заблокировал.

Для моих целей просто сканирование по таймеру работает.Возможно, вам придется найти другое решение, например, вызвать его асинхронно в другом потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...