0

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

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

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

可能是什么问题?在尝试了所有这些之后,我什至不知道从哪里开始。哪些类型的问题只能针对特定机器上的特定用户?

4

4 回答 4

1

可能是几件事:

  • 损坏/丢失的注册表项

  • 文件权限问题

  • 保存在用户配置文件中的设置

您可以使用两种方法:

  • 使用进程监视器查看是否在相同访问某些资源后出现问题

  • 禁用部分后台工作程序以隔离导致应用程序挂起的代码。

于 2012-04-04T20:57:55.810 回答
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

重读你的问题,这部分对我来说很重要。

“它停止记录日志,但最后一个日志条目位于无关紧要的代码部分(即显示标签)。”

如果您在 DoWork 事件处理程序中修改 Visible 属性或修改标签的文本,这可能是您的问题。再次尝试将该代码移至 ReportProgress 事件处理程序或使用上面的 InovokeRequired 方法来解决此问题。

于 2012-04-04T21:12:51.430 回答
1

“事件日志没有帮助。它只是说应用程序停止响应。”

在这些情况下,您将获得第二次机会异常(调试器可以捕获的第一次机会异常 - 否则它是第二次机会)只需使用 DebugDiag(它有许多规则可以在挂起时捕获的内存转储上运行)。或者,您可以使用 windbg,它非常硬核,但值得了解基础知识。

我相信您可以研究更多信息,这里是 如何使用调试诊断工具的开始

获得更多信息的最佳网站是 Tess Ferrandez:http: //blogs.msdn.com/b/tess/archive/2009/01/23/net-hang-analyzing-debug-diag-output.aspx

于 2012-04-05T06:23:07.730 回答
0

这是 TableAdapter.Fill 方法,填充绑定到 UI 控件的数据集,填充数据显然会导致大问题。为什么它不为每个人都这样做,我不知道。

在这里查看答案。

于 2012-04-12T00:21:08.770 回答