C#winfrom什么情况下定义一个delegate(不是事件)?业界规范是什么?

RT,我是每一项功能(方法函数)或者线程定义一个delegate,还是根据需要的形参不同而分别定义delegate,无关实现功能的分类。比如
按功能定义:
delegate void MultiFileProBarAddValueDelegate(); //定义一个委托
private void Add() {
if (this.InvokeRequired)
{
this.BeginInvoke(new MultiFileProBarAddValueDelegate(Add));

        }
        else
        {
            multiFileProgressBar.Value += 1;
        }
    }
    delegate void MultiFileProBarAdd1ValueDelegate(SQLiteDataReader dr,int temp);

private void MultiFileDataGridViewRowsCreate(SQLiteDataReader dr, int temp)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new MultiFileProBarAdd1ValueDelegate(MultiFileDataGridViewRowsCreate));
}
else
{
while (dr.Read())
{
/*
添加数据项
*/
}
}
delegate void MultiFileDeleteDelegate();
delegate void MultiFileReturnDelegate();
private void MultiFileReturn()
{
if (this.InvokeRequired)
{
this.BeginInvoke(new MultiFileReturnDelegate(MultiFileReturn));

        }
        else
        {
            if (multiFileChoiceButton.Enabled == false)
            {
                multiFileChoiceButton.Enabled = true;
            }
            multiFileReturnButton.Visible = true;
            multiFileWorkingButton.Text = "开始扫描";
        }
    }

/**/
delegate void UniFileDelegate();
delegate void UniFileFillDelegate(SQLiteCommand commandInsert);
delegate void UniFileResultDelegate(SQLiteDataReader dr, List drList);
delegate void UniFileDeleteDelegate(List drList);

只按形参不同定义:
/*同样多文件*/
delegate void MultiFileDelegate();
private void Add() {
if (this.InvokeRequired)
{
this.BeginInvoke(new MultiFileDelegate(Add));

        }
        else
        {
            multiFileProgressBar.Value += 1;
        }
    }

    private void MultiFileChoiceButtonChange()
    {
        if (this.InvokeRequired) 
        {
            this.BeginInvoke(new MultiFileDelegate(MultiFileChoiceButtonChange));
        }
        else
        {
            multiFileChoiceButton.Enabled = false;
        }
    }

    private void MultiFileReturn()
    {
        if (this.InvokeRequired)
        {
            this.BeginInvoke(new MultiFileDelegate(MultiFileReturn));

        }
        else
        {
            if (multiFileChoiceButton.Enabled == false)
            {
                multiFileChoiceButton.Enabled = true;
            }
            multiFileReturnButton.Visible = true;
            multiFileWorkingButton.Text = "开始扫描";
        }
    }

private void MultiFileDataGridViewRowsCreate(SQLiteDataReader dr, int temp)
{
if (this.InvokeRequired)
{
this.BeginInvoke(new MultiFile1Delegate(MultiFileDataGridViewRowsCreate));
}
else
{
while (dr.Read())
{
/*
添加数据项
*/
}

这个没有规定,看你的业务需要,如果是无关的业务功能,可以单独写,或者定一个 委托,通过参数区分功能,不同参数去执行不同的业务逻辑

就你的代码来说,因为需要在工作线程更新界面,为了避免线程冲突,所以需要把对界面的调用放在界面线程做,于是将要操作的代码作为委托传给界面线程。
通过 Control.Invoke 在界面线程调用。

但是委托运用的场景可多了去了。它的作用是传递一个方法,由被调用者调用(或者叫回调)。

你的代码写得太繁琐,delgate定义可以完全删除
1、C#新版委托可以直接用Action,不需要再用delgate来定义,如Action multiFile=MultiFile; 后面是委托要执行的方法
当然如果有参数就这样 Action multiFile=MultiFile;
执行异步时: multiFile.BeginInvoke(2,"2",null,null); 就行

2、如果你需要返回值 使用Func 最后一个是返回值
3、参数最多16个
没什么业界规范

你的代码写得太繁琐,delgate定义可以完全删除
1、C#新版委托可以直接用Action,不需要再用delgate来定义,如Action multiFile=MultiFile; 后面是委托要执行的方法
当然如果有参数就这样 Action multiFile=MultiFile;
执行异步时: multiFile.BeginInvoke(2,"2",null,null); 就行

2、如果你需要返回值 使用Func 最后一个是返回值
3、参数最多16个
没什么业界规范

这个真没有什么规范 都是按照你公司的逻辑需求 自己设定就可以了,应该和您身边的人的习惯

用lambda表达式简化就可以了,不需要定义不同的委托,
例如无返回值无参数、或一个或多个参数的:
无参的直接 this.BeginInvoke(new Action(()=>{ /*做你自己要做的事情*/ }));
一个string类型参数的可以 this.BeginInvoke(new Action((s)=>{ /*做你自己要做的事情*/ }));
一个int类型一个string类型的可以 this.BeginInvoke(new Action((a,b)=>{ /*做你自己要做的事情*/ }));

有返回值无参数、或一个或多个参数的:
返回为int类型参数为string类型的 this.invoke(new Func((a)=>{return 1;}));
返回为string类型参数为一个string类型一个int类型的 this.invoke(new Func((a,b)=>{return 1;}));
....依次类推

不过注意一下有返回值的我用的是invoke,直接同步返回一个object类型的对象,用begininvoke的话是返回一个IAsyncResult对象,想要真正获取执行的返回值需要调用endinvoke去获取

上面写的时候没注意漏掉了。。。应该是 this.BeginInvoke(new Action((s)=>{ /*做你自己要做的事情*/ })); 和this.BeginInvoke(new Action((a,b)=>{ /*做你自己要做的事情*/ })); this.invoke(new Func((a)=>{return 1;})); this.invoke(new Func((a,b)=>{return 1;}));