2017-08-30 101 views
0

我一直无法让下面的C#线程代码正常工作。我通过单击窗体上的按钮来启动一个线程,线程只是简单地声明一个浮点数x并在循环中递增它,直到threadRunning设置为false。当我再次单击按钮时,我将threadRunning设置为false。循环完成时,线程将threadResult设置为递增值x。然后我在窗体上显示threadResultC#线程 - 当断点存在时,线程只能正常运行

问题是在这种情况下threadResult始终设置为256.0。如果我选择x增加0.0001f,那么threadResult将始终设置为2048.0。每次线程运行时,这些固定值分配给threadResult .. 除非我在递增的行上放置了一个断点x += 0.00001f;。这可以是条件设置为false的条件断点;只要此线路上存在已启用的断点,x就会正确递增并分配给threadResult

---编辑1 --- 为了澄清什么正确的行为是仅仅发生在上递增行存在一个启用断点:threadResult被分配等于倍递增线被击中乘以数量的值按增量值。因此,如果x增加了121次,增量值为0.00001f,则threadResult应该变为0.00121。这个确实当增量行上存在已启用的断点时发生,并且正在调试模式下运行。另外,当我在发布模式下运行这个程序时,程序在我单击按钮停止线程时会挂起,所以我假设我的线程实现完全是错误的。我仍然很欣赏任何关于我的代码可能存在问题的指针。我只想写一些东西来测试停止线程。另外,我不想使用BackgroundWorkers,因为我的线程代码不打算用于Windows窗体。 ---完编辑1 ---

任何人都可以向我解释这是怎么回事?通过在线程之外将线程的循环控制变量设置为false,用于停止线程的方法是否正确?我已经在Visual Studio 2017,2015和2013中尝试了这些代码,所有结果都一样。

这是代码。该表单只包含一个名为button1的按钮和一个名为textBox1的文本框。

using System; 
using System.Windows.Forms; 
using System.Threading; 

namespace ThreadingTesting 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
     InitializeComponent(); 
     button1.Click += Button1_Click; 
     } 

     private Thread thread; 
     private bool threadRunning = false; 
     private float threadResult = 0; 

     private void Button1_Click(object sender, EventArgs e) 
     { 
     if (threadRunning) 
     { 
      threadRunning = false; 
      thread.Join(); 
      textBox1.Text = "Result: " + threadResult.ToString("N4"); 
      button1.Text = "Start Thread"; 
     } 
     else 
     { 
      thread = new Thread(new ThreadStart(ThreadedWork)); 
      thread.Start(); 
      textBox1.Text = "Thread Started!"; 
      button1.Text = "Stop Thread"; 
     } 
     } 

     private void ThreadedWork() 
     { 
     threadRunning = true; 
     float x = 0.0f; 
     while (threadRunning) 
     { 
      x += 0.00001f; 
     } 
     threadResult = x; 
     return; 
     } 
    } 
} 
+0

尝试查找关键字“volatile”。 – Enigmativity

+3

'线程只有在断点存在时才能正常运行'你看到的不正确的行为是什么?你正在寻求什么正确的行为? – mjwills

+0

如果你试图不阻止用户界面,你应该看看'async' /'await' – Liam

回答

3

256 + 0.00001f不幸导致256。这就是为什么它永远不会超过256.

考虑使用doubled)而不是floatf)。

+0

或更好 - “小数”(M)。 '256M + 0.00001M'。 – i486

+0

发表于编辑1 – bgg

+0

好的,使用双重作品。当我进行第一次编辑时,我一定不能改变所有双打。这仍然不能解释为什么只有当断点存在时它才与'float'一起工作。 – bgg