我有一个简单的状态标签,在长时间运行过程中经常更新。例程在计时器上,因此在另一个线程上,所以我得到了Cross-thread operation not valid错误。我找到了一个解决办法,它看起来是这样的:
lblQuery1Status.Invoke(new Action(delegate
{
lblQuery1Status.Text = "Status: Publishing";
}));但是,我在例程中更新了该控件的文本7或8次。是否有更有效或更简单的方法来做到这一点?
发布于 2016-09-08 18:59:06
如果您想“简化”语法,可以始终使用内联lambda来“缩短”语法:
lblQuery1Status.Invoke(new Action(() => lblQuery1Status.Text = "Status: Publishing"));您还可以为调用创建一个操作变量,并在需要时重新调用该操作:
Action updateStatus = () =>
lblQuery1Status.Invoke(new Action(() => lblQuery1Status.Text = "Status: Publishing"));然后,您可以根据需要以方法的形式多次调用它:
updateStatus();发布于 2016-09-08 19:36:59
这就是我使用的解决方案,基于@David L的answer above。
行动定义:
Action<string> updateStatus = (s) =>
statusLabel[qo.id].Invoke(new Action(() => statusLabel[qo.id].Text = s));呼叫:
updateStatus("Opening Connection");我意识到它没有更高的效率,但它更简单,更干净,它让我更不畏缩。
发布于 2016-09-08 18:54:13
不幸的是,这是从长期运行的任务/线程获取数据到UI线程的最佳方法,编组有其开销,但除非您每秒钟调用它数百次,否则我认为您会没事的
https://stackoverflow.com/questions/39398172
复制相似问题