CreateObject导致应用程序池挂起

时间:2011-11-29 15:33:39

标签: vb.net iis

我正在运行这个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'提供服务的进程超出了时间   关闭期间的限制。进程ID为'1340'。

我唯一能想到的是应用程序未正确关闭。我已经读过objMP3 = Nothing实际上没有关闭它(或者它与传统的vb不同)。

我还在服务器上设置了Debug Diagnostics。当发生挂起时,会创建一个大文件(> 8GB),每秒只有这行多次。

  

[11/8/2011 9:28:36 PM]第一次机会异常 - 0xc0000005引起的   系统ID为2548的线程

任何想法?

1 个答案:

答案 0 :(得分:0)

为了从.NET正确释放COM对象,并确保运行终结器,您应该调用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.
        }
    }