gpt4 book ai didi

c# - 具有零值 double 的奇怪 if 语句行为

转载 作者:行者123 更新时间:2023-11-30 16:13:04 25 4
gpt4 key购买 nike

有人愿意向我解释一下 this.oBalance.QouteBalance 的值是如何被评估为小于零的吗?请参见下图。

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

enter image description here

public double QouteBalance { get; set; }

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

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

编辑 2:我正在 Release模式中构建和运行。

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

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

我有一个 Timer 对象,它在每次滴答时执行以下操作:

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

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

最佳答案

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

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

编辑:回答您的编辑:

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

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

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

编辑 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 可能是一个易变的 bool 值,它可以通过 Interlocked 访问。命名空间方法,它可以是锁定等。您选择什么取决于您。

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

关于c# - 具有零值 double 的奇怪 if 语句行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22181991/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com