.net Winforms应用程序挂起,但仅针对特定计算机上的特定用户?

.net Winforms应用程序挂起,但仅针对特定计算机上的特定用户?,.net,winforms,user-profile,.net,Winforms,User Profile,我有一个用户不能在他的机器上运行应用程序的特定部分。只有在这台计算机上,对于这个用户,应用程序才会挂起。用户可以使用其凭据在其他计算机上成功运行它。另外,其他用户可以使用自己的凭据成功运行它 事件日志没有帮助。它只是说应用程序停止响应。我添加了一些日志记录,以查看应用程序在停止记录日志记录之前能走多远,但最后一个日志记录条目位于代码中无关紧要的部分(即显示标签) 我知道问题出在backgroundworker上,因为如果我对backgroundworker的调用进行注释,则应用程序不会挂起 可能

我有一个用户不能在他的机器上运行应用程序的特定部分。只有在这台计算机上,对于这个用户,应用程序才会挂起。用户可以使用其凭据在其他计算机上成功运行它。另外,其他用户可以使用自己的凭据成功运行它

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

我知道问题出在backgroundworker上,因为如果我对backgroundworker的调用进行注释,则应用程序不会挂起

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

可能有以下几种:

  • 注册表项已损坏/丢失

  • 文件权限问题

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

您可以使用两种方法:

  • 使用Process Monitor查看问题是否在相同的资源访问之后发生

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

    • 可能有几件事:

      • 注册表项已损坏/丢失

      • 文件权限问题

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

      您可以使用两种方法:

      • 使用Process Monitor查看问题是否在相同的资源访问之后发生

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


        • 你的问题很模糊,但它让我想起了我在使用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;
              }
          }
          

          重读你的问题,这一部分对我来说很突出

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


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

          您的问题非常模糊,但它提醒我使用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;
              }
          }
          

          重读你的问题,这一部分对我来说很突出

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

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

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

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

          我相信你可以研究更多的信息,这是一个开始

          获取更多信息的最佳网站是Tess Ferrandez:

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

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

          我相信你可以研究更多的信息,这是一个开始

          获取更多信息的最佳网站是Tess Ferrandez:
          这是TableAdapter。填充方法、填充绑定到UI控件的数据集、填充数据显然造成了很大的问题。我不知道为什么它不为每个人这样做


          查看答案。

          是TableAdapter.Fill方法,填充绑定到UI控件的数据集,填充数据appa