2015-05-15 7 views
2

У меня есть два события нажатия кнопки в моем приложении формы окна.Функция C#, которая имеет значение параметра метода, или с помощью делегата

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(); 

} 

Все работает проблема correctly.But является 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)); 
} 

Пожалуйста, позвольте мне получить ваше предложение.

ответ

6

Pass делегата, например:

// 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 в следующей строке? Это то, что «действует» на «кусок» из Winforms ...

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