我已经编写了一个在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编译的。代码分析很干净。
在声明问题不在我的代码之前,我还能执行其他任何步骤吗?
答案 0 :(得分:1)
首先,如果您的代码中没有问题,您仍然需要学习足够的知识来创建变通方法,对吗?
您可以采取一些调试步骤:
int tmpListViewCount = listViewAddedKeys.CheckedItems.Count; int tmpAddedCount = added.Count; if( tmpListViewCount < tmpAddedCount ) { // HashFromSelected, etc.. }
交换tmpListViewCount
和tmpAddedCount
或使用其他方法先运行tmpAddedCount
。
尝试实例化.CheckedItems列表或从listViewAddedKeys
中提取它,这样它就是一个单独的对象。有没有办法可以直接检查它,以便你可以知道它中有多少个物体(即计数应该返回什么)?也许通过一个断点和鼠标?直接在该对象上尝试.count
。也许创建一个你直接设置列表的静态的(不确定该类是什么)。
CheckedItemsClass tmpCheckedItems = listViewAddedKeys.CheckItems; int tmpListViewCount = tmpCheckedItems.Count; int tmpAddedCount = added.Count; if( tmpListViewCount < tmpAddedCount ) { // HashFromSelected, etc.. }
listViewAddedKeys.CheckedItems
和added
变量调用此函数,该变量具有您提前知道的已定义计数(1会很好......)。也许组成一个按钮,每个按钮添加1个项目,然后调用此函数,如果成功,您可以手动添加更多。我觉得问题出在&#34; CheckedItems&#34;正在创造或如何计算,但不确定。当你计算Checked Items时,是否会增加一个计数,进行无限循环?无论如何,这些至少应该显示一些调试方法,您可以使用它们来分解和设置调试会话,以便您可以更好地控制情况。理想情况下,您事先知道在调试之前您期望两个计数是什么 - 假设您希望这些方法如何工作以及它们将返回什么,那么您就可以明确地了解哪些方面不符合您的期望。在此之后准确修改您发送到函数中的内容,以查看它如何更改响应等。基本上,应用科学方法。