将循环代码外包到方法中。在该方法中您将需要使用BeginInvoke https://msdn.microsoft.com/en-us/library/0b1bf3y3(v=vs.110).aspx写信给TextBox
private void DoTheLoop()
{
int a = 1;
int A = 0; //variable that takes counter value (the one I want)
int B = 0; //variable that takes counter status
do
{
HS_UC_GetCounter(1, ref A, ref B);
decimal C = (Convert.ToDecimal(A) / 100);
textBox1.BeginInvoke(new Action(()=>{textBox1.Text = "Das ist: " + C;}));
} while (a == 1);
}
第一个版本使用正常的Thread https://msdn.microsoft.com/en-us/library/system.threading.thread(v=vs.110).aspx:
创建一个线程并在以下情况下使用新方法启动它button3
被点击
private void button3_Click(object sender, EventArgs e)
{
System.Threading.Thread t = new System.Threading.Thread(()=>DoTheLoop());
t.Start();
}
这不应阻止您的 GUI,并且文本框将显示值
第二版用一个后台工作者 https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v=vs.110).aspx:
创建一个BackgroundWorker并注册DoWork
event:
System.ComponentModel.BackgroundWorker worker = new System.ComponentModel.BackgroundWorker();
private void Form1_Load(object sender, EventArgs e)
{
worker.DoWork += Worker_DoWork;
}
在事件处理程序内部调用相同的方法DoTheLoop()
:
private void Worker_DoWork(object sender, DoWorkEventArgs e)
{
DoTheLoop();
}
在按钮单击事件中启动工作人员:
private void button1_Click(object sender, EventArgs e)
{
worker.RunWorkerAsync();
}
最后的结果是一样的:)