访问由另一个线程创建的对象而无需每次调用?
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");
我意识到它并没有提高效率,但它更简单、更干净,让我不那么畏缩了。
我有一个简单的状态标签,我在长时间的 运行 例程中经常更新它。该例程在计时器上,因此在另一个线程上,所以我得到 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");
我意识到它并没有提高效率,但它更简单、更干净,让我不那么畏缩了。