我正在运行这个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的线程
任何想法?
答案 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.
}
}