我的问题如下:
1.我有一个在 while 循环中更新 GUI 元素(图表)的强化方法
2.我需要在按下按钮时跳出这个循环。
3.问题是按钮事件处理程序在 while 循环完成之前不会执行。
4.我试过在单独的线程上运行该方法,但这是非常有问题的,因为它设置和读取许多 UI 元素,我几乎无法让它工作,所以我希望有一种方法在单独的线程上运行停止按钮并更新全局变量,让我跳出循环。
知道如何实现吗?
private void playBack(int playTime, int runUntil)
{
var frameTime = new DateTime(); var frameTime_ = new DateTime();
bool fwd = true;
if (runUntil < playTime) fwd = false;
playTime = trPlay.Value;
playGoStop = true;
lbPlayTime.Text = (playTime * numDtStepSize.Value).ToString();
while (true) //trPlay.Maximum + 1)
{
frameTime = DateTime.UtcNow;
if ((frameTime - frameTime_).TotalMilliseconds > (double)(1000 / numFps.Value))
{
systemUpdate(playTime);
trPlay.Value = playTime;
trPlay.Update();
lbPlayTime.Update();
frameTime_ = frameTime;
if (fwd)
{
playTime++;
if (playTime > runUntil) break;
}
else
{
playTime--;
if (playTime < runUntil) break;
}
}
if (!playGoStop) break;
}
}
最佳答案
在您的 while 循环中,您可以调用 Application.DoEvents()
。它将从事件队列中获取 UI 事件,并处理这些事件。然后,将处理您的按钮事件。
您可以通过关键字 Application.DoEvents()
和 C#
进行搜索。关于它的话题很多。
更新:
在您的代码中,它内部是一个无限循环。我不喜欢在主线程中无限运行。我更愿意在 worker-thread
中运行它。并发送消息以在主线程中执行 UI
更新。通常,UI
事件需要在主线程中处理。
如果无限 while 循环已经在 worker-thread
中,它应该在每个循环中休眠 5~10 ms,以便释放 CPU 资源来处理其他线程中的一些事件。
关于c# - UI 按钮在单独的线程上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31736491/