所以我有一个在OSX上的Mono 3.12.0中运行的控制台应用程序。有时候,我的意思是,也许每执行100次或更多次CleanupPriorToApplicationStart()
,就会得到下面的stacktrace,并且调用cleanup方法的父线程死亡。基本上,Process.Start必须包装本机代码,并且该本机代码会引发异常,至少我认为这是正在发生的事情。尽管该过程仍然存在,所以它不是完整的exit(),这使得很难知道何时发生并进行纠正。cleanup方法的日志消息中的Exception处理程序永远不会将其放置在那里,因此,无论出于何种原因,mono运行时都不会将此原生异常包装在.NET / Mono异常中,因此可以对其进行处理。这是预期的吗?有没有一种方法可以在不删除线程的情况下捕获此行为?
protected override void CleanupPriorToApplicationStart()
{
try
{
ResetAppleMailDefaultWindowSize();
}
catch (Exception ex)
{
logger.Warning(ex, "{ApplicationName} Default Window Size reset FAILED with message", ApplicationName);
}
}
private void ResetAppleMailDefaultWindowSize()
{
logger.Debug("{0} resetting Default Window Size", ApplicationName);
var info = new ProcessStartInfo("defaults", " write com.apple.mail 'NSWindow Frame Torn Off Window' '13 630 1024 768 0 0 2560 1417'");
var p = new Process {StartInfo = info};
p.Start();
p.WaitForExit(6.Seconds());
logger.Debug("{0} Default Window Size reset", ApplicationName);
}
这是控制台的输出
DEBUG - "Mail" resetting Default Window Size
Stacktrace:
at <unknown> <0xffffffff>
at (wrapper managed-to-native) System.Diagnostics.Process.Process_free_internal (System.Diagnostics.Process,intptr) <0xffffffff>
at System.Diagnostics.Process.Dispose (bool) <0x0013f>
at System.Diagnostics.Process.Finalize () <0x00018>
at (wrapper runtime-invoke) object.runtime_invoke_virtual_void__this__ (object,intptr,intptr,intptr) <0xffffffff>
Native stacktrace:
更新:
由于进行了一些谷歌搜索,我想强调一点,在调用Cleanup方法之前,我明确地调用了Garbage Collection GC.Collect();
事实证明,垃圾回收绝对是罪魁祸首。CleanupPriorToApplicationStart()
在启动GC之前,我已将呼叫移至,并且不再看到这些零星的错误。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句