【问题标题】:c# function which has method parameter value, or using delegate具有方法参数值或使用委托的 c# 函数
【发布时间】:2015-07-27 00:02:20
【问题描述】:

我的窗体应用程序中有两个按钮单击事件。

private void butProcess_1_Click(...)
{
    /// below parameters are just sample.
    Process_1(int_param1, decimal_param2, datetime_param3);
}

private void butProcess_2_Click(...)
{
    /// below parameters are just sample.
    Process_2(string_param1, guid_param2, byteArray_param3, bool_param4);
}

由于这些进程需要更长的时间才能完成执行,我需要向用户显示进度条。
所以我修改了名为 butProcess_1_Click 的事件。

private void butProcess_1_Click(...)
{
    frmLoadingControl _frmLoadingControl = new frmLoadingControl();            
    _frmLoadingControl.Show(this);

    BackgroundWorker _BackgroundWorker = new BackgroundWorker();
    _BackgroundWorker.DoWork += (s, args) =>
    {
        this.Invoke(new MethodInvoker(() => this.Enabled = false));
        /// below parameters are just sample.
        Process_1(int_param1, decimal_param2, datetime_param3);
    };
    _BackgroundWorker.RunWorkerCompleted += (s, args) =>
    {
        _frmLoadingControl.Close();
        this.Invoke(new MethodInvoker(() => this.Enabled = true));
    };

    _BackgroundWorker.RunWorkerAsync();

}

一切正常。但问题是 butProcess_2_Click 我需要从 butProcess_1_Click 复制所有代码。 而且我只需要更改一行来调用 process_2()。

Process_2(string_param1, guid_param2, byteArray_param3, bool_param4);

我不想复制我的代码。我想做的如下所示。

public void GenericFunction(Function _FunctionCode)
{
    frmLoadingControl _frmLoadingControl = new frmLoadingControl();            
    _frmLoadingControl.Show(this);

    BackgroundWorker _BackgroundWorker = new BackgroundWorker();
    _BackgroundWorker.DoWork += (s, args) =>
    {
        this.Invoke(new MethodInvoker(() => this.Enabled = false));
        /// below parameters are just sample.
        //Process_1(int_param1, decimal_param2, datetime_param3);
        //Process_2(string_param1, guid_param2, byteArray_param3, bool_param4);
        Execute(_FunctionCode);
    };
    _BackgroundWorker.RunWorkerCompleted += (s, args) =>
    {
        _frmLoadingControl.Close();
        this.Invoke(new MethodInvoker(() => this.Enabled = true));
    };

    _BackgroundWorker.RunWorkerAsync();
}

private void butProcess_1_Click(...)
{
    /// below parameters are just sample.
    //Process_1(int_param1, decimal_param2, datetime_param3);
    GenericFunction(Process_1(int_param1, decimal_param2, datetime_param3));
}

private void butProcess_2_Click(...)
{
    /// below parameters are just sample.
    //Process_2(string_param1, guid_param2, byteArray_param3, bool_param4);
    GenericFunction(Process_2(string_param1, guid_param2, byteArray_param3, bool_param4));
}

请告诉我你的建议。

【问题讨论】:

    标签: c# delegates delegation


    【解决方案1】:

    传递一个委托,如下所示:

    // CHANGE HERE
    public void GenericFunction(Action action)
    {
        frmLoadingControl _frmLoadingControl = new frmLoadingControl();            
        _frmLoadingControl.Show(this);
    
        BackgroundWorker _BackgroundWorker = new BackgroundWorker();
        _BackgroundWorker.DoWork += (s, args) =>
        {
            this.Invoke(new MethodInvoker(() => this.Enabled = false));
    
            // CHANGE HERE
            action();
    
            Execute(_FunctionCode);
        };
        _BackgroundWorker.RunWorkerCompleted += (s, args) =>
        {
            _frmLoadingControl.Close();
            this.Invoke(new MethodInvoker(() => this.Enabled = true));
        };
    
        _BackgroundWorker.RunWorkerAsync();
    }
    
    private void butProcess_1_Click(...)
    {
        // CHANGE HERE
        GenericFunction(() => Process_1(int_param1, decimal_param2, datetime_param3));
    }
    

    不应该这样_frmLoadingControl.Close(); 放在下一行的Invoke 中吗?它是“作用”在 Winform 的“一块”上的东西......

    this.Invoke(new MethodInvoker(() => 
    {
        _frmLoadingControl.Close();
        this.Enabled = true;
    }));
    

    【讨论】:

      【解决方案2】:

      您应该使用操作委托 - https://msdn.microsoft.com/en-us/library/018hxwa8(v=vs.110).aspx

      后台工作人员已过时。相反,您应该使用异步方法。 - https://msdn.microsoft.com/en-us/library/hh191443.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-12-17
        • 2011-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-22
        • 1970-01-01
        • 2012-12-31
        相关资源
        最近更新 更多