C# 泛化调用函数和委托

C# 泛化调用函数和委托,c#,winforms,invoke,C#,Winforms,Invoke,如何将这两个功能/委托分解为一个通用功能和委托? 有没有一个简单的方法可以做到这一点 public TabControl tab; public Label devlog; delegate void tabHandlerCallback(bool e); public void tabHandler(bool e) { if (tab.InvokeRequired) { tab.Invoke(new tabHandlerCallback(tabHandler)

如何将这两个功能/委托分解为一个通用功能和委托? 有没有一个简单的方法可以做到这一点

public TabControl tab;
public Label devlog;

delegate void tabHandlerCallback(bool e);
public void tabHandler(bool e)
{
    if (tab.InvokeRequired)
    {
        tab.Invoke(new tabHandlerCallback(tabHandler), new object[] { e });
    }
    else
    {
        tab.Enabled = e;
    }
}

delegate void devHandlerCallback(string e);
public void devHandler(string e)
{
    if (devlog.InvokeRequired)
    {
        devlog.Invoke(new devHandlerCallback(devHandler), new object[] { e });
    }
    else
    {
        devlog.Text = e;
    }
}
        

您可以创建一个函数,该函数可以直接运行必要的代码,也可以通过调用

private void InvokeIfNecessary(控制、操作)
{
if(control.invokererequired)
控制。调用(动作);
其他的
动作();
}
//像这样使用它
公共无效devHandler(字符串e)
{
InvokeIfNecessary(()=>devlog.Text=e);
}
公共空选项卡处理程序(布尔e)
{
InvokeIfNecessary(()=>tab.Enabled=e);
}

您可以使用以下代码

public delegate void InvokeDelegate();

//T_Elapsed is a thread and controls required invoke
private void T_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    this.BeginInvoke(new InvokeDelegate(InvokeMethodLabel));
    this.BeginInvoke(new InvokeDelegate(InvokeMethodProgressBar));
}
void InvokeMethodLabel()
{
    myLabel.Text = "Test Label";
}
void InvokeMethodProgressBar()
{
    progressBar.Value = (int)(progressBar.Value * 2);
}
我是这样做的:

delegate void controlHandlerCallback(object control, object param, string field = "Text");
public void controlHandler(object control, object param, string field="Text")
{
    if (((Control)control).InvokeRequired)
    {
        ((Control)control).Invoke(new controlHandlerCallback(controlHandler), new object[] { control, param,field });
    }
    else
    {
        PropertyInfo propertyInfo = control.GetType().GetProperty(field);
        propertyInfo?.SetValue(control, param);
    } 
}

tab
devlog
的类型是什么?我编辑了我的帖子并添加了它们的声明如果这些是winform表单中事件的处理程序,只需使用设计器将事件连接到同一个处理程序(选择其中一个)并删除另一个处理程序的代码如果使用2002年以后开发的工具,例如BackgroundWorker或(理想情况下)
等待
来管理您的工作(如果您不能,您将面临一些相当大的问题),那么您将永远不需要首先显式调用。此外,如果您不知道自己是否在UI线程上,那么您在程序设计中犯了一些非常非常非常非常非常非常错误的事情。您可以在编译时知道哪些方法需要从UI线程运行,哪些方法需要从非UI线程运行。这从根本上提高了读取和维护它的能力。我找到了解决方案并发布了答案谢谢,你认为有可能用一个ref来考虑两个处理程序函数吗?你能解释一下你在处理程序中使用的参数吗,我不知道如何使用它们