我的同事喜欢这样做
if (!listbox1.InvokeRequired)
listbox1.Items.Add(Container.error_message);
else
listbox1.Invoke((MethodInvoker)delegate
{
listbox1.Items.Add(Container.error_message);
});
他为什么要查InvokedRequired?只使用这句话会更好吗?
listbox1.Invoke((MethodInvoker)delegate
{
listbox1.Items.Add(Container.error_message);
});
发布于 2014-06-13 07:01:05
如果您确信某个特定的路由只能通过回调线程到达,那么我倾向于同意您的意见--这并不是为了避免Invoke
,而是为了避免任何重复。如果可以从多个路由到达路径,则最好进行检查以避免非线程情况下的任何开销,但是:重构使每个代码路径都知道自己正在做什么(只调用实用方法)可能更好,即UI线程只调用Foo()
,因为工作线程使用Invoke
/ MethodInvoker
调用Foo()
。
发布于 2014-06-13 06:59:21
如果您确信该方法将从非GUI线程调用,那么使用InvokeRequired就没有意义了。
此外,您可以将该listbox1.Items.Add(Container.error_message);
放入一个方法中(不要重复)。该方法可以在不需要InvokeRequired的情况下从GUI调用,也可以通过从后台线程调用来调用。
最后,(如果有的话)通常的模式是这样的:
void AddMessageToListBox(String message)
{
if (listbox1.InvokeRequired)
{
listbox1.Invoke((Action<String>)AddMessageToListBox, message);
return;
}
listbox1.Items.Add(message);
}
发布于 2014-06-13 07:04:29
InvokeRequired
检查使代码在由GUI线程(执行第一个if块)运行时和由非GUI线程(块的第二部分)运行时都能工作。
它看上去有点复杂,但是如果按照设计,代码可以由任何一个线程运行,那么至少Invoke
是必要的。据我所知,您可以选择只按照您的建议使用Invoke
,它在由GUI线程运行时也能工作,但它的效率可能略低一些。您可能会认为这是微观优化,但我建议您简单地测试在这两种情况下发生的事情以及它所消耗的时间。
https://stackoverflow.com/questions/24199412
复制相似问题