【问题标题】:EXE throws errors when DEBUG does not当 DEBUG 没有时 EXE 会抛出错误
【发布时间】:2012-08-29 17:23:14
【问题描述】:

该程序有一个弹出的表单,您在几个字段中输入文本,然后按关闭。关闭后,输入的信息将保存到 newItem 类中。

当我按 F5 调试我的程序时,一切正常。但是当我从我的调试文件夹运行可执行文件时,我得到了这个错误。

System.ArgumentException: An item with the same key has already been added.
    At.... line 168

这是代码。

if (!LoadedItem.Contains(newItem))
{
    LoadedItem.Add(newItem);
}

我放置了一个断点,单步执行代码,一切似乎都按预期进行。如果LoadedItem 中已经有newItem,它会跳过。但由于某种原因,它似乎忽略了 .exe 中的 if 语句。

如果您需要更多信息,请告诉我。

如果有任何帮助,我将不胜感激,因为我一生都无法弄清楚为什么会发生这种情况。

【问题讨论】:

  • 你在做多线程吗?
  • 您是否为 newItem 的类型定义了自定义运算符?
  • 是的,我正在做多线程,是的,我有 newItem 的自定义运算符。
  • 我不确定你有自定义运算符是什么意思,但听起来你有多个线程同时添加到 LoadItem。尝试锁定它。 msdn.microsoft.com/en-us/library/ms173179.aspx
  • 锁定它不起作用,但还是谢谢你。

标签: c# .net exception-handling visual-studio-debugging


【解决方案1】:

锁定LoadedItem 应该可以工作

lock(LoadedItem) {
    if (!LoadedItem.Contains(newItem))
       LoadedItem.Add(newItem);
}

请注意,您必须在代码中写入和读取 LoadedItem 的每个点上使用锁定。

如果您阅读多于写入,请使用ReaderWriterLockSlim 以获得更好的性能。

如果您使用的是 .Net4,则可以使用 System.Collections.Concurrent 命名空间中的一些集合。

【讨论】:

  • 避免锁定您自己的代码的一个选项是使用ConcurrentDictionary
  • LoadedItem 的使用比我想象的要多,相当大的项目。但是锁定它们都不起作用,而且我没有 4.5 所以没有 ConcurrentDicttionary。它只是避免了 if 语句。无论如何感谢您的帮助
  • 经过多次试验和错误后,foreach 检查项目名称与 newitem.Name 并将 bool 设置为 true,如果为 false,则运行代码......丑陋
【解决方案2】:

这听起来像是线程问题。确保 LoadedItem 和 NewItem 是本地绑定的变量,因此这两个引用保证是同一个对象。

出于调试目的,将“包含”和“添加”替换为您可以调查其行为的包装函数。

【讨论】:

    猜你喜欢
    • 2019-09-21
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2013-10-01
    • 2021-08-13
    • 2016-06-01
    • 1970-01-01
    • 2020-02-27
    相关资源
    最近更新 更多