【发布时间】:2016-08-20 01:02:55
【问题描述】:
如果我启动我的 C# Windows 窗体应用程序,按钮会挂起,因为它是无限循环。我想通过全局变量查看button2点击进入button1无限循环的变量值变化
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace XX_5
{
public partial class Form1 : Form
{
private int g;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
int i = 0;
for (;;)
{
textBox1.AppendText("ID: [" + i++ + "] Variable value: [" + g + "]\n");
}
}
private void button2_Click(object sender, EventArgs e)
{
g = 1;
}
}
}
【问题讨论】:
-
@Grant Winney 你好,你能告诉我一些例子如何做同样但正确的方式,GUI中的无限循环和从button2到button1内处理的值我只是想在什么时候改变它button2 被按下
-
这个问题太宽泛了,特别是考虑到 Stack Overflow 上已经存在多少关于不阻塞 UI 线程的基本概念的问答。只有一个线程处理 UI 的绘制。如果您不让该线程执行任何其他操作,因为您陷入了无限循环,那么 绘制 UI 将不会发生。有关如何处理此问题的一些建议,请参阅标记的副本。
-
对于 .NET 4.5,我建议
Task.Run()开始操作,并建议Progress<T>将任何相关的进度报告提供回主线程。或者,您可以在循环中使用async/await,其中await对循环的每次迭代执行Task.Run()操作。 -
最简单的方法是将
Application.DoEvents();放入循环中。 一般而言,Application.DoEvents()被认为是一种 hack。使用Task和async/await通常会带来更易于维护的设计。
标签: c# winforms global-variables infinite-loop cycle