访问由另一个线程创建的对象而无需每次调用​​?

Access object created by another thread without invoking every time?

我有一个简单的状态标签,我在长时间的 运行 例程中经常更新它。该例程在计时器上,因此在另一个线程上,所以我得到 Cross-thread operation not valid 错误。我在 SO 上找到了修复程序,看起来像这样:

lblQuery1Status.Invoke(new Action(delegate
{
    lblQuery1Status.Text = "Status: Publishing";
}));

但是,我在例程中更新了这个控件的文本 7 或 8 次。有没有更有效或更简单的方法来做到这一点?

不幸的是,这是从长 运行 task/thread 线程获取数据到 UI 线程的最佳方式,编组有其开销,但除非您多次调用它其次,我认为你会没事的

如果你想要 "simplify" 语法,你总是可以使用内联 lambda 来 "shorten" 语法:

lblQuery1Status.Invoke(new Action(() => lblQuery1Status.Text = "Status: Publishing"));

您还可以为调用创建一个动作变量,并在需要时重新调用该动作:

Action updateStatus = () => 
    lblQuery1Status.Invoke(new Action(() => lblQuery1Status.Text = "Status: Publishing"));

然后您可以根据需要多次将其作为方法调用:

updateStatus();

这是我采用的解决方案,基于 @David L's

动作定义:

Action<string> updateStatus = (s) => 
     statusLabel[qo.id].Invoke(new Action(() => statusLabel[qo.id].Text = s));

致电:

updateStatus("Opening Connection");

我意识到它并没有提高效率,但它更简单、更干净,让我不那么畏缩了。