CreateObject вызывает зависание пула приложений - PullRequest
0 голосов
/ 29 ноября 2011

Я использую этот код VB.NET для преобразования файлов WAV в mp3. Обычно он работает около 20 раз в час. Случайно, примерно раз в день, пул приложений зависает на objMP3 = CreateObject("AudioConverter.AudioConverterx"). Перезапуск пула приложений исправляет это.

'convert the file
objMP3 = CreateObject("AudioConverter.AudioConverterx")
objMP3.Logfile = myLogFileName
objMP3.Convert(myWAVfile, myMP3file, "-cMP3")
objMP3 = Nothing

Каждый раз, когда это происходит, в журнале событий появляется такая ошибка:

Неисправное приложение w3wp.exe, версия 6.0.3790.3959, штамп 45d6968e, неисправный модуль audioconverter.dll, версия 0.0.0.0, штамп 2a425e19, отладки? 0, адрес ошибки 0x0000402e.

И системный журнал имеет это:

Процесс, обслуживающий пул приложений "tts.servername.com", превысил время ограничения при выключении. Идентификатор процесса был 1340.

Единственное, о чем я могу думать, это то, что приложение не закрывается должным образом. Я читал, что objMP3 = Nothing на самом деле не закрывает его (или не работает так же, как в классическом vb).

Я также настроил Диагностику отладки на сервере. Когда происходит зависание, создается большой файл (> 8 ГБ) с этой строкой несколько раз в секунду.

[08.11.2011 21:28:36] Исключение первого шанса - 0xc0000005, вызванное поток с идентификатором системы: 2548

Есть идеи?

1 Ответ

0 голосов
/ 29 ноября 2011

Чтобы правильно освободить COM-объект из .NET и убедиться, что его финализаторы запущены, вы должны вызвать Marshall.ReleaseComObject .

Это код, который я использую:

    'convert the file
    objMP3 = CreateObject("AudioConverter.AudioConverterx")
    ' Do stuff
    ReleaseComObject(objMP3)

    private void ReleaseComObject(object o)
    {
        try
        {
            if (o != null)
            {
                // As per the documentation, call ReleaseComObject in a loop
                // until all references are released.
                while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0)
                {
                }
            }

            o = null;
        }
        catch (System.Runtime.InteropServices.COMException)
        {
            // Do nothing. We don't want exceptions to leak out of this method.
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...