具有零值双精度的奇怪 if 语句行为

2023-12-31

有人愿意向我解释一下它的价值吗this.oBalance.QouteBalance因小于零而被评估为真,但显然不是?请参见下图。

在比较 C# 中的双精度数时,我是否遗漏了一些基本的东西?

public double QouteBalance { get; set; }

UpdateBalance_PositionOpenned()不是在循环中调用,而是作为更复杂的事件驱动过程的一部分被调用,该过程在计时器的滴答声上运行(以毫秒为单位)

EDIT:如果代码很混乱,请原谅,但我无法编辑它,因为这是经过相当长的运行时间后的运行时错误,所以担心无法重新创建它。异常消息不正确,只是对我自己的提醒。异常之后的代码是我在开始此特定运行之前忘记注释掉的代码。

EDIT 2:我正在构建并运行发布模式.

EDIT 3:请原谅我的无知,但看起来我实际上是在多线程环境中运行,因为此代码是作为更复杂的对象方法的一部分被调用的,该方法在计时器的滴答(事件)上执行。是否可以要求计时器等到其事件处理程序内的所有代码都完成后才能再次计时?

EDIT 4:由于这已被确定为多线程问题;我将尝试提供更广泛的背景以得出优化的解决方案。

我有一个Timer对象,它在每个刻度上执行以下操作:

  1. 运行后台工作者从文件中读取数据
  2. 当后台工作人员完成从文件读取数据时,引发 事件
  3. 在事件处理程序中,运行调用以下方法的对象代码 (如图所示)和其他多个例程,包括 GUI 更新。

我想这个问题可以通过使用计时器 Tick 事件从文件中读取来避免,但更改它会破坏我的代码的其他部分。


您正在从多个线程访问共享变量。这可能是一种竞争条件,其中一个线程引发了错误,但当调试器捕获并附加错误时,变量的值已更改。

您需要考虑实现同步逻辑,例如锁定共享变量等。

Edit:回答您的编辑:

您无法真正告诉计时器不要滴答(当然可以,但是您会开始和停止,甚至在调用 Stop 之后,您可能仍然会收到更多事件,具体取决于它们的调度速度)。也就是说,您可以查看 Interlocked 命名空间并使用它来设置和清除 IsBusy 标志。如果您的 tick 方法触发并发现您已经在工作,它只会在该轮中等待,等待未来的 tick 来处理工作。我不会说这是一个很好的范例,但它是一个选择。

我指定使用 Interlocked 类而不是仅使用共享变量的原因归结为您可以同时从多个线程访问这一事实。如果您不使用互锁,您可能会得到两个勾号,既检查值又得到答案,他们可以在翻转标志以阻止其他人进入之前继续进行。你也会遇到同样的问题。

同步对共享数据成员的访问的更传统方法是使用锁定,但是您很快就会遇到tick事件触发太快的问题,并且它们将开始支持您。

Edit 2:要回答有关在多个线程上将数据与共享变量同步的方法的问题,这实际上取决于您具体在做什么。我们对您的应用程序正在执行的操作只有一个非常小的窗口,因此我将从所有评论和答案中将其拼凑在一起,希望它能为您的设计选择提供信息。

下面是伪代码。这是基于您提出的问题,该问题表明您不需要在每个刻度上都进行工作。蜱虫本身并不重要,它只需要不断地进来。基于这个前提,我们可以使用标记系统来检查您是否忙碌。

...
Timer.Start(Handle_Tick)
...

public void Handle_Tick(...)
{
    //Check to see if we're already busy. We don't need to "pump" the work if
    //we're already processing.
    if (IsBusy)
        return;

    try
    {
        IsBusy = true;

        //Perform your work
    }
    finally
    {
        IsBusy = false;
    }
}

在这种情况下,IsBusy 可能是一个易失性布尔值,可以通过以下方式访问它联锁 http://msdn.microsoft.com/en-us/library/system.threading.interlocked%28v=vs.110%29.aspx命名空间方法,可能是锁定等。您选择什么取决于您。

如果这个前提不正确,并且您实际上必须在计时器的每个滴答声中进行工作,那么这对您不起作用。你正在扔掉忙碌时进来的蜱虫。如果您想保留每个进入的时钟周期,您需要实现一个同步队列。如果您的频率很高,您必须小心,因为您最终会溢出。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有零值双精度的奇怪 if 语句行为 的相关文章

随机推荐

  • 如何在 Swift 中实现与 Strongify 相同的行为?

    我有一个 self 较弱的闭包 我需要确保 self 在闭包执行期间被保留 并在执行完成后由闭包释放 之前它是由 strongify 完成的 在 Swift 中还有其他方法可以做到这一点吗 虽然其他答案有效 但另一种选择是使用反引号 这样做
  • Akka.Net Streams 和远程处理 (Sink.ActorRefWithAck)

    我使用 Akka net Streams 做了一个非常简单的实现Sink ActorRefWithAck 订阅者向发布者请求一个大字符串 发布者通过切片发送它 它在本地 UT 工作得很好 但是不远程 我不明白出了什么问题 具体来说 订阅者能
  • 如何在 Django 中拥有这样的 URL?

    我怎样才能有这样的网址example com category catename operation 在姜戈 此外 在某些情况下 用户输入空格分隔的类别 我该如何处理 例如 如果用户输入 我的家 类别 则该类别的 URL 将变为exampl
  • 在 Azure Cosmos DB 中使用 Gremlin 重命名属性

    我们的一些代码库已经更改 因此它现在期望过去具有名称为 Sdg 的属性的顶点现在具有名称为 causeType 且具有相同值的属性 简而言之 财产的重命名 在这一点上我已经尝试了很多 而且 令我有点惊讶的是弄清楚如何搜索图表并在需要时进行重
  • 即使 JSON 已建立索引,查询中是否也需要分区键

    我计划使用 Cosmos Db 文档 Db 并且尝试了解查询 索引和分区如何相互关联 如何在 Azure Cosmos Db 中进行分区和缩放 https learn microsoft com en us azure cosmos db
  • 带有要排列的行的标量

    如何转换包含数组中带有换行符的字符串的标量 并将这些行作为元素 例如 考虑到这一点 lines line 1 nline 2 nline 3 n 我想检索这个 lines 0 gt line 1 n lines 1 gt line 2 n
  • 有什么办法可以在网页上显示C++吗?

    有没有一种相对简单的方法可以在网页上显示 C 程序的输出 我并不是指手动 换句话说 您在网页上看到它 因为它运行 而不是像我制作代码标签并自己编写它一样 编辑 为了让每个人都能清楚地了解这一点 我将把它发布在这里 我不想用 C 制作网页 如
  • 根据索引初始化 MATLAB 矩阵

    我正在尝试创建一个满足以下条件的矩阵 M M i j f i j 对于一些f 我可以通过说进行元素初始化M zeros m n 然后循环 例如 八度 M zeros m n for i 1 m for j 1 n m i j i j 2 e
  • 如何将 C# 文档生成为 CHM 或 HTML 文件?

    有没有办法直接从 Visual Studio 中从代码文档生成可读文档文件 也考虑2010年 代码示例
  • 在父类中记录静态方法

    我有一个抽象类 Parent 有 2 个子类 A 和 B Parent 有一个名为 do 的静态方法 我想知道是否有一种方法可以让该静态方法在 A 类被称为 A do 时在 Logger 中添加日志信息 在被称为 B do 时在 Logge
  • PHP Exception::getCode() 与其实现的 Throwable 接口相矛盾

    我发现了一个我无法理解的矛盾 异常 getCode https www php net manual en exception getcode php 有这样的定义 final公共异常 getCode 无效 mixed 附说明 返回异常代码
  • 什么存储位置(SQL Server 或文件系统)可以提高保存 tiff 图像的性能?

    我们的系统需要存储大小约为 3k 的 tiff 图像 我们在给定时间收到约 300 张图像 需要快速处理它们 一旦收到约 100 000 张图像 这些图像就会从我们的系统转移到另一个存档系统或被清除 我正在寻找图像文件初始保存的最佳性能 传
  • 有没有关于 gremlin 'match()' 如何工作的文档?

    我正在用 match 遍历编写 gremlin 查询 某些模式匹配的行为似乎与其他模式语言不同 输入遍历器值如何与模式变量绑定 g V A B match as x as y project x y gt x v A y v A gt x
  • 使用summary r 进行逻辑值计数

    在数据框中 我有一列包含 Y 和 N 值 该数据框还有一个 id 列 我想创建两列 一列包含 Y 总数 另一列包含每个 id 的 N 总数 我尝试使用 dplyr summarise 函数执行此过程 group by id gt summa
  • Polymer 2.0 webcomponents-loader.js 缺少 Edge polyfill

    我们目前将项目从 Polymer 1 更新到 Polymer 2 混合版本 我知道 webcomponents hi sd ce js 是 Edge 的 polyfill 在 Microsoft Edge 上测试页面时 我现在收到一条错误
  • 服务器端验证 Facebook 用户

    我正在编写一个 Facebook 应用程序 其中列出了用户的朋友 并与用户提供的有关他们的信息 存储在 Google App Engine 数据库中 进行交叉引用 我的应用程序的运行方式如下 用户登录 Facebook 后 通过 Faceb
  • 如何在页面刷新时保留无线电输入状态

    我有一个表单 如果用户提交有错误的表单 以防页面刷新 我需要在该表单上存储所有单选按钮的状态 我想实现与此非常相似的目标 function example input type radio checked each function thi
  • 如何检查复制快照代理状态?

    我想在使用此语句启动代理后检查代理的状态 EXEC sp startpublication snapshot publication 因为我想做下一步 需要工作已经开始 我不相信有内置复制存储过程来检查快照代理状态 我可能是错的 但是 您可
  • 将 Maven 输出发送到文件

    在 Windows 7 上 我尝试发送maven 3命令到文本文件 我从我试图分析的项目的根目录调用该命令 命令是 mvn dependency tree Dverbose Dincludes commons collections Dou
  • 具有零值双精度的奇怪 if 语句行为

    有人愿意向我解释一下它的价值吗this oBalance QouteBalance因小于零而被评估为真 但显然不是 请参见下图 在比较 C 中的双精度数时 我是否遗漏了一些基本的东西 public double QouteBalance g