gpt4 book ai didi

c# - 自动化 InvokeRequired 代码模式

转载 作者:IT王子 更新时间:2023-10-29 03:30:21 26 4
gpt4 key购买 nike

我已经痛苦地意识到需要在事件驱动的 GUI 代码中编写以下代码模式的频率,其中

private void DoGUISwitch() {
// cruisin for a bruisin' through exception city
object1.Visible = true;
object2.Visible = false;
}

变成:

private void DoGUISwitch() {
if (object1.InvokeRequired) {
object1.Invoke(new MethodInvoker(() => { DoGUISwitch(); }));
} else {
object1.Visible = true;
object2.Visible = false;
}
}

这在 C# 中是一个笨拙的模式,既要记住又要输入。有没有人想出某种捷径或结构来在一定程度上自动化它?如果有一种方法可以将函数附加到执行此检查的对象,而无需完成所有这些额外的工作,比如 object1.InvokeIfNecessary.visible = true 类型快捷方式,那就太好了。

上一个 answers已经讨论了每次只调用 Invoke() 的不切实际,即使那样 Invoke() 语法既低效又仍然难以处理。

那么,有没有人想出任何捷径?

最佳答案

李的方法可以进一步简化

public static void InvokeIfRequired(this Control control, MethodInvoker action)
{
// See Update 2 for edits Mike de Klerk suggests to insert here.

if (control.InvokeRequired) {
control.Invoke(action);
} else {
action();
}
}

可以这样调用

richEditControl1.InvokeIfRequired(() =>
{
// Do anything you want with the control here
richEditControl1.RtfText = value;
RtfHelpers.AddMissingStyles(richEditControl1);
});

无需将控件作为参数传递给委托(delegate)。 C# 自动创建一个 closure .

如果你必须返回一个值,你可以使用这个实现:

private static T InvokeIfRequiredReturn<T>(this Control control, Func<T> function)
{
if (control.InvokeRequired) {
return (T)control.Invoke(function);
} else {
return function();
}
}

更新:

根据其他几位发帖人的说法,Control 可以概括为 ISynchronizeInvoke:

public static void InvokeIfRequired(this ISynchronizeInvoke obj,
MethodInvoker action)
{
if (obj.InvokeRequired) {
var args = new object[0];
obj.Invoke(action, args);
} else {
action();
}
}

DonBoitnott 指出,与 Control 不同,ISynchronizeInvoke 接口(interface)需要一个用于 Invoke 方法的对象数组作为 action 的参数列表


更新 2

Mike de Klerk 建议的编辑(请参阅第一个代码片段中的注释以获取插入点):

// When the form, thus the control, isn't visible yet, InvokeRequired  returns false,
// resulting still in a cross-thread exception.
while (!control.Visible)
{
System.Threading.Thread.Sleep(50);
}

参见 ToolmakerSteve'snawfal's对此建议的疑虑,请在下方发表评论。

关于c# - 自动化 InvokeRequired 代码模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2367718/

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