C#代码挂起了对Listview.CheckedTems.Count的调用 - 如何排除故障?

时间:2017-08-30 22:43:53

标签: c# wpf listview visual-studio-2017

我已经编写了一个在Visual Studio 2017中创建的C#Windows表单。

在按钮单击事件处理程序中,我有一个永远不会完成的简单if语句:

  

if(listViewAddedKeys.CheckedItems.Count< added.Count)

listViewAddedKeys是一个ListView,"添加了"是一个Hashtable。

这是完整的功能:

private void buttonSaveAdded_Click(object sender, System.EventArgs e)
    {
        try
        {
            saveFileDialog.ShowDialog();
            if (saveFileDialog.FileName != String.Empty)
            {
                OnProgressEvent("Saving Data...");
                DisableControls(this.Controls);
                if (listViewAddedKeys.CheckedItems.Count < added.Count)
                    HashFromSelected(ref listViewAddedKeys, ref added, out currentSaving, false);
                else
                    currentSaving = added;
                BeginSaveData.BeginInvoke(saveFileDialog.FileName, ref currentSaving,
                    OnSaveDataCallback, BeginSaveData);
            }
        }
        catch (Exception ex)
        {
            OnProgressEvent("Problem in buttonSaveAdded_Click(): " + ex.Message);
        }
    }

listViewAddedKeys是一个ListView,&#34;添加了&#34;是一个Hashtable。

如果我突破界线: DisableControls(this.Controls);

并添加&#34; listViewAddedKeys.CheckedItems.Count&#34;到&#34;观看1&#34;调试器的选项卡,调试器无法检索值(函数评估超时)。如果我将其更改为&#34; listViewAddedKeys&#34;我可以深入研究它(例如,我可以看到项目计数是1,478,670),但是,如果我继续向下滚动它,Visual Studio会崩溃。

我没有对线程做任何棘手的事情,我对任何东西的唯一锁定都设置了断点,但尚未触发。

我尝试遵循建议here,但windbg中的输出都没有与他们希望我查找的项匹配。

此时运行时CPU利用率为0,资源管理器显示它没有对磁盘,内存或网络执行任何操作。

这是在Windows 10(自2017年8月30日完全修补)企业系统上。代码是为.NET Framework 4.6.1编译的。代码分析很干净。

在声明问题不在我的代码之前,我还能执行其他任何步骤吗?

1 个答案:

答案 0 :(得分:1)

首先,如果您的代码中没有问题,您仍然需要学习足够的知识来创建变通方法,对吗?

您可以采取一些调试步骤:

  1. 为计数创建临时变量,看看是否可以在if语句之外跳过它们:
  2. int tmpListViewCount = listViewAddedKeys.CheckedItems.Count;
    int tmpAddedCount = added.Count;
    if( tmpListViewCount < tmpAddedCount )
    { // HashFromSelected, etc.. }
    
    1. 交换tmpListViewCounttmpAddedCount或使用其他方法先运行tmpAddedCount

    2. 尝试实例化.CheckedItems列表或从listViewAddedKeys中提取它,这样它就是一个单独的对象。有没有办法可以直接检查它,以便你可以知道它中有多少个物体(即计数应该返回什么)?也许通过一个断点和鼠标?直接在该对象上尝试.count。也许创建一个你直接设置列表的静态的(不确定该类是什么)。

    3. CheckedItemsClass tmpCheckedItems = listViewAddedKeys.CheckItems; 
      int tmpListViewCount = tmpCheckedItems.Count;
      int tmpAddedCount = added.Count;
      if( tmpListViewCount < tmpAddedCount )
      { // HashFromSelected, etc.. }    
      
      1. 设置UI,以便您使用静态listViewAddedKeys.CheckedItemsadded变量调用此函数,该变量具有您提前知道的已定义计数(1会很好......)。也许组成一个按钮,每个按钮添加1个项目,然后调用此函数,如果成功,您可以手动添加更多。
      2. 我觉得问题出在&#34; CheckedItems&#34;正在创造或如何计算,但不确定。当你计算Checked Items时,是否会增加一个计数,进行无限循环?无论如何,这些至少应该显示一些调试方法,您可以使用它们来分解和设置调试会话,以便您可以更好地控制情况。理想情况下,您事先知道在调试之前您期望两个计数是什么 - 假设您希望这些方法如何工作以及它们将返回什么,那么您就可以明确地了解哪些方面不符合您的期望。在此之后准确修改您发送到函数中的内容,以查看它如何更改响应等。基本上,应用科学方法。