我尝试对某些服务器从Windows Server 2008升级到2012时出现的问题进行分类。该应用程序是一个.NET 3.5 C#WinForms应用程序,它会旋转一个线程来运行一些可能非常长的 - 运行存储过程。
后台线程设置如下:
t = new System.Threading.Thread(new System.Threading.ThreadStart(StartProcess));
t.IsBackground = true;
t.Priority = System.Threading.ThreadPriority.BelowNormal;
t.Start();
StartProcess()将一些状态更新发回到可以正常工作的UI线程,然后最终进入这样的调用:
// cmd is configured with a CommandTimeout value of 0
using( SqlDataAdapter da = new SqlDataAdapter(cmd) )
{
DataSet ds = new DataSet();
da.Fill(ds);
return ds;
}
Fill()
调用适用于短期运行的sprocs,但如果使用长时间运行的sprocs(执行时间以小时为单位),则GUI最终会在15-45分钟后无响应。关联的sproc将运行完成,但GUI不会再次更新。
诊断问题还需要哪些其他信息?两个操作系统版本之间是否存在一些固有的差异,使这个实现有问题?
我还应该提一下,当通过Visual Studio在调试模式下运行时,此应用程序将正常工作;只有在运行已部署的发布模式版本时才会发生挂起。我尝试创建一个简单的WinForms应用程序,该应用程序调用一个简单地使用WAITFOR
模拟50分钟运行时间的sproc,但这并没有表现出在实际应用程序中看到的无响应。
答案 0 :(得分:1)
通过大量的谷歌搜索和评论中提供的提示,我相信我已经能够识别并解决问题。
最大的帮助是这个MSDN博客post与我的经验相符。
基本上,我需要在挂机时将windbg附加到我的进程中,并且通过windbg我能够将我的问题识别为OnUserPreferenceChanged
问题。然后我再次将windbg连接到我的应用程序,然后挂起并执行以下windbg命令:
!name2ee System_Windows_Forms_ni System.Windows.Forms.Application+MarshalingControl..ctor
bp [JITTED_ADDRESS_FROM !name2ee CALL]".echo MarshalingControl creation detected. Callstack follows.;!clrstack;.echo"
我发现正在通过t
线程填充/显示表单。我在InvokeRequired
支票中打包了这个电话,我的问题现在似乎已经消失了。