- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我现在正在编写 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/
public void SomeMethod() { List someList = LoadList(); if(condition) { MethodInvoke
这有什么区别: richTextBox1.Invoke((MethodInvoker)(() => richTextBox1.Clear())); 还有这个: Invoke((MethodInvoke
MethodInvoker 的这两种用法到底有什么区别: 1: textBox1.Invoke(new MethodInvoker(b)); 2: textBox1.Invoke((MethodInv
我有一个后端类,它必须引发一个没有参数的事件。 MethodInvoker 具有所需的签名,但在后端类中使用它感觉有点奇怪,因为它是在 System.Windows.Forms 中定义的。在 .Net
我现在正在编写 GUI 应用程序有一段时间了,我经常使用的一件事是 MethodInvoker + lambda 函数来进行跨线程访问。 从我发现的例子中,我总是看到这样的东西: 版本 1 if (I
以下代码可以正常编译和运行。 void myInvokedMethod(string s) { Console.WriteLine(s); } void myInvoker() { I
我需要完成以下场景。 ThreadMethod() 是一个 Timer 方法,我在 Invoke 语句中更新了 UI。我需要等到 Invoke 完成它的工作,然后继续该方法。我该如何应对? publi
我有一个具有后台线程的 C++/CLI 应用程序。我经常希望它把结果发布到主 GUI 上。我读过elsewhere on SO MethodInvoker 可以用于此目的,但我正在努力将语法从 C#
我正在使用它来更改其他线程上的某些内容: MethodInvoker m = () => { login_submit.Text = "Login"; }; if (I
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: MethodInvoker vs Action for Control.BeginInvoke Th
我正在对计时器进行简单的 GUI 更新。如果我更新单个控件,哪种方法更好?像这样的 MethodInvoker: this.Invoke((MethodInvoker)delegate { sys
在查看其他一些开发人员的代码时,我已经看到了这两个版本的代码: 1. Me.BeginInvoke(New MethodInvoker(Sub() cbo.ShowPopup())) 2.
有人可以解释一下下面的代码吗: this.Invoke((MethodInvoker)delegate {
我需要从我的线程中访问一个共享的日志文件,所以我现在尝试使用 MethodInvoker 来读取文件并返回一个 bool 值,这取决于它是否找到了一个条目。但是得到这个错误,无法弄清楚如何让它返回一个
我正在使用异步套接字操作,当客户端收到一条消息时,它使用以下代码调用一个方法并执行 Methodinvoker: private void AddText(string message)
哪个更正确,为什么? Control.BeginInvoke(new Action(DoSomething), null); private void DoSomething() { Mess
两者有什么区别? Invoke((MethodInvoker) delegate { checkedListBox1.Items.RemoveAt(i); checke
#1 和#2 有什么区别: 代码 1(编译成功): byte[] GetSomeBytes() { return (byte[])this.Invoke((
我有一个 c# 但是代码,我需要它在 cli/c++ 中,但我总是得到这个错误 "Error 2 error C2955: 'BaseLibCS::MethodInvoker' : use of cl
使用 C# 2.0 和 MethodInvoker 委托(delegate),我有一个 GUI 应用程序从 GUI 线程或工作线程接收一些事件。 我使用以下模式处理表单中的事件: private vo
我是一名优秀的程序员,十分优秀!