我的用户无法在其计算机上运行应用程序的特定部分。它只在这台机器上,对于这个应用程序挂起的用户。用户可以在其凭据下的其他计算机上成功运行它。此外,其他用户可以使用自己的凭据成功运行它。
事件日志没有帮助。它只是说应用程序停止响应。我添加了一些日志记录,以查看应用程序在停止记录日志记录之前获得了多远,但最后一个日志记录条目位于代码的一部分,这是无关紧要的(即显示标签)。
我知道问题出在后台工作中,因为如果我注释掉对backgroundworker_DOWORK的调用,该应用程序就不会挂起。
可能是什么问题?我不知道在尝试这一切之后哪里开始。哪些类型的问题只能针对特定计算机上的特定用户?
答案 0 :(得分:1)
可能是一些事情:
损坏/缺少注册表项
文件权限问题
保存在用户个人资料中的设置
您可以使用两种方法:
使用进程监视器查看在对某些资源进行相同访问后是否出现问题
禁用部分后台工作程序以隔离导致应用程序挂起的代码。
答案 1 :(得分:1)
您的问题非常模糊,但它让人想起我在使用BackgroundWorker时遇到的随机崩溃。我有时会花上几周而且从来没有抱怨程序崩溃,而在其他日子我会有10个左右的投诉。事实证明我遇到的问题是由于我修改了UI。修改任何UI值(例如修改文本框的Text属性)被视为对主线程的不安全线程调用。所有UI修改都应该在主线程上进行,而不是在DoWork方法中进行。如果需要修改UI,可以使用后台工作程序的ReportProgress方法或修改它检查InvokeRequired属性的代码,如下所示。只有当您设置/修改它们时,才能从UI读取值不是问题。
private void SetText(string text)
{
// InvokeRequired required compares the thread ID of the
// calling thread to the thread ID of the creating thread.
// If these threads are different, it returns true.
if (this.textBox1.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.Invoke(d, new object[] { text });
}
else
{
this.textBox1.Text = text;
}
}
请参阅http://msdn.microsoft.com/en-us/library/ms171728.aspx
重读你的问题,这部分对我说。
“它停止记录日志记录,但最后一个日志记录条目位于代码的一部分,无关紧要(即显示标签)。”
如果要修改Visible属性或修改DoWork事件处理程序中的标签文本,这可能是您的问题。再次尝试将该代码移动到ReportProgress事件处理程序或使用上面的InovokeRequired方法来解决问题。
答案 2 :(得分:1)
“事件日志没有帮助。它只是说应用程序停止响应。”
在这些你获得第二次机会异常的情况下(a 调试器可以捕获的第一次机会异常 - 否则它是第二次 机会)只需使用DebugDiag(它有许多规则可以 运行在挂起时捕获的内存转储)。或者你可以使用 windbg,它非常硬核,但值得了解基础知识。
我相信你可以研究更多信息,这是一个开始 How to Use the Debug Diagnostic Tool
获得更多信息的最佳网站是Tess Ferrandez: http://blogs.msdn.com/b/tess/archive/2009/01/23/net-hang-analyzing-debug-diag-output.aspx
答案 3 :(得分:0)
这是TableAdapter.Fill方法,填充绑定到UI控件的数据集,显然填充数据导致了大问题。为什么不为每个人这样做,我不知道。
请参阅答案here。