不要使用 DoEvents()。使用线程!
这个口头禅正在互联网上漫游,包括 SO。好的,所以我创建了一个简短的概念证明,我尝试只使用线程。所以基本上按钮应该做的是触发向下移动蓝色框。
它在单独的线程中运行 YET windows 窗体没有响应(我无法移动它或再次单击按钮),直到它完成向下移动。
问题是,我搞砸了什么?如果我不应该使用 DoEvents(),那该怎么办?(如果您取消注释该Application.DoEvents()
行,它将变得响应)。
代码
using System;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;
namespace doevents
{
public partial class Main : Form
{
// Use static so that I don't have to pass them over and over
public static TableLayoutPanel movingBox;
public static Form mainForm;
// Initialize
public Main()
{
InitializeComponent();
Main.mainForm = this;
Main.movingBox = tableLayoutPanel1;
}
// Button that runs thread which will move the blue box down
private void button1_Click(object sender, EventArgs e)
{
new Thread(
new ThreadStart(
() =>
{
SlideBoxDown();
}
)
).Start();
}
// Delegate
delegate void SlideBoxDownCallback();
// Slide box down
private static void SlideBoxDown()
{
if (Main.movingBox.InvokeRequired)
{
SlideBoxDownCallback d = new SlideBoxDownCallback(SlideBoxDown);
Main.mainForm.Invoke(d, new object[] { });
}
else
{
for (int i = 0; i < 20; i++)
{
Main.movingBox.Location = new Point(Main.movingBox.Location.X, Main.movingBox.Location.Y + 2);
Thread.Sleep(100);
//Application.DoEvents();
}
}
}
}
}
应用布局