UI按钮在单独的线程上运行?

时间:2015-07-31 00:57:40

标签: c# user-interface button interrupt

我的问题如下:

1.我有一个强化方法,可以在while循环中更新GUI元素(图表)

2.按下按钮时,我需要突破这个循环。

3.Problem是按钮事件处理程序,直到while循环结束才执行。

4.我已经尝试在单独的线程上运行该方法,但这是非常有问题的,因为它设置和读取了许多UI元素,几乎我无法使其工作,所以我&m; m希望有一种方法可以在一个单独的线程上运行停止按钮并更新一个全局变量,让我摆脱循环。

任何想法如何实现?

currenttime

2 个答案:

答案 0 :(得分:1)

在您的while循环中,您可以拨打Application.DoEvents()。它将从事件队列中获取UI事件,并处理这些事件。然后,您的按钮事件将被处理。

您可以按关键字Application.DoEvents()C#进行搜索。关于它的主题很多。

<强>更新

在你的代码中,它是一个无限的while循环。我不想在主线程中运行无限。我宁愿在worker-thread中运行它。并发送消息以在主线程中执行UI更新。通常,需要在主线程中处理UI个事件。

如果无限while循环已经在worker-thread中,它应该在每个循环中休眠大约5~10 ms,以便释放CPU资源来处理其他线程中的某些事件。

答案 1 :(得分:0)

您应该查看将UI元素(图表)数据绑定到DependencyProperty。这允许您在非UI线程上运行密集方法,允许您的UI线程响应按钮单击。在后台线程中,只需调用Dispatcher.BeginInvoke()来更新DependencyProperty(因为它只能从UI线程更新),这将更新绑定到它的控件。

就你的按钮中断而言,一个简单的解决方案是从你的UI设置一个标志,在每次循环迭代中检查。更复杂的解决方案是在任务Task中运行此密集方法,为其提供CancellationTokenSource,然后在按钮单击时取消源。