【发布时间】:2016-12-12 02:07:12
【问题描述】:
运行 .NET 4.5.2 (app1) 的 C# 控制台应用程序打开一个 COM 应用程序 (app2) 并使用该 app2 的 API 进行一些工作。到目前为止,所有的工作都成功了,但是有时当 app1 试图关闭 app2 时,app2 会永久挂起。
如果 app2 的进程以任务管理器结束,则 app1 报告访问被拒绝。出现这种情况是因为终止的进程不再可用,还是因为它阻塞了 app1 中的线程并且在允许线程继续之前无法报告错误?
用来终止app2的代码是
private static void CloseSW(SldWorks swApp, Process sw_proces)
{
// Close with API call
if (Task.Run(() => { swApp.CloseAllDocuments(true); swApp.ExitApp(); }).Wait(TimeSpan.FromSeconds(20)))
return;
// Kill process if API call failed
if (Task.Run(() => { SWHelper.CloseSW(sw_proces); }).Wait(TimeSpan.FromSeconds(20)))
return;
// Unable to close SolidWorks, ignore error and continue
// This will eventually cause SolidWorks to crash and the crash handler will take over
}
此代码的完成时间不应超过 40 秒,但可能是 COM 互操作导致了一些意外行为?
我无法在开发机器上重现此错误。跟踪确切故障点的最佳方法是什么?失败可能不在 CloseSW 中,而是在此之前的某个时间点。有没有比将每一行写入日志文件更好的方法来跟踪错误?
还值得注意的是,此代码可运行 60 - 150 次,然后才会出现任何错误,并且在每次运行之间关闭两个应用程序。
我可以控制远程环境,因此可以选择远程调试,但我之前从未设置过。
【问题讨论】:
标签: c# debugging logging com trace