gpt4 book ai didi

c# - 在不调用的情况下使用 MethodInvoker

转载 作者:太空狗 更新时间:2023-10-30 00:05:27 25 4
gpt4 key购买 nike

我现在正在编写 GUI 应用程序有一段时间了,我经常使用的一件事是 MethodInvoker + lambda 函数来进行跨线程访问。

从我发现的例子中,我总是看到这样的东西:

版本 1

if (InvokeRequired)
{
Invoke(new MethodInvoker(() =>
{
Label1.Text = "Foobar";
});
}
else
{
Label1.Text = "Foobar";
}

但是这会导致代码重复 --> 对我来说是个大坏蛋。

这有什么问题吗?

版本 2

MethodInvoker updateText = new MethodInvoker(() => 
{
Label1.Text = "Foobar";
});

if (InvokeRequired)
{
Invoke(updateText);
}
else
{
updateText();
}

现在我将功能捆绑在一个变量中,并在适当时使用 Invoke 或函数指针调用它。版本 2 在性能方面是否更差?还是我为此使用匿名函数是不好的做法?

最佳答案

它没有任何问题...但是您可以添加一个扩展方法来让它变得更好:

public static void InvokeIfNecessary(this Control control,
MethodInvoker action)
{
if (control.InvokeRequired)
{
control.Invoke(action);
}
else
{
action();
}
}

然后你可以这样写:

this.InvokeIfNecessary(() => Label1.Text = "Foobar");

更整洁:)

在您不需要时创建委托(delegate)有一个非常轻微的性能缺陷,但它几乎可以肯定是微不足道的 - 专注于编写干净的代码。

请注意,即使您不想这样做,您仍然可以在现有代码中简化变量声明:

MethodInvoker updateText = () => Label1.Text = "Foobar";

这是使用单独变量的一个好处 - 您不需要 new MethodInvoker 位来告诉 lambda 表达式您想要什么类型的委托(delegate)...

关于c# - 在不调用的情况下使用 MethodInvoker,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11947718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com