我一直无法让下面的C#线程代码正常工作。我通过单击窗体上的按钮来启动一个线程,线程只是简单地声明一个浮点数x
并在循环中递增它,直到threadRunning
设置为false。当我再次单击按钮时,我将threadRunning
设置为false。循环完成时,线程将threadResult
设置为递增值x
。然后我在窗体上显示threadResult
。C#线程 - 当断点存在时,线程只能正常运行
问题是在这种情况下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;
}
}
}
尝试查找关键字“volatile”。 – Enigmativity
'线程只有在断点存在时才能正常运行'你看到的不正确的行为是什么?你正在寻求什么正确的行为? – mjwills
如果你试图不阻止用户界面,你应该看看'async' /'await' – Liam