Winforms应用程序挂起,但仅适用于特定计算机上的特定用户?

时间:2012-04-04 20:26:17

标签: .net winforms user-profile

我的用户无法在其计算机上运行应用程序的特定部分。它只在这台机器上,对于这个应用程序挂起的用户。用户可以在其凭据下的其他计算机上成功运行它。此外,其他用户可以使用自己的凭据成功运行它。

事件日志没有帮助。它只是说应用程序停止响应。我添加了一些日志记录,以查看应用程序在停止记录日志记录之前获得了多远,但最后一个日志记录条目位于代码的一部分,这是无关紧要的(即显示标签)。

我知道问题出在后台工作中,因为如果我注释掉对backgroundworker_DOWORK的调用,该应用程序就不会挂起。

可能是什么问题?我不知道在尝试这一切之后哪里开始。哪些类型的问题只能针对特定计算机上的特定用户?

4 个答案:

答案 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