Я бы немного переосмыслил ваш дизайн.
Если бы вы реализовали обработку в базовом классе, вы могли бы разделить ее на две альтернативы, которые были бы почти взаимозаменяемыми.
Первый может быть как ваш, где требуется операция, которая возвращает значение. (Однако я бы переработал это, чтобы использовать Func<T>
вместо того, чтобы иметь свой собственный тип делегата.
Второй может просто выполнить простое действие и не предоставить возвращаемое значение. Оба могут использовать одну и ту же анимацию / отображение / и т. Д. рутины, но предоставляют другой способ работы. Вы также можете передать это другим методам, используя базовый класс, что обеспечит большую гибкость.
При таком подходе вы можете назвать это так:
private void DoSleep()
{
Thread.CurrentThread.Sleep(5000);
}
private int ReturnSleep()
{
Thread.CurrentThread.Sleep(5000);
return 5000;
}
...
{
var actionWindow = new OperatingWindowAction(this.DoSleep);
actionWindow.Execute();
var funcWindow = new OperatingWindowFunc<int>(this.ReturnSleep);
funcWindow.Execute();
int result = funcWindow.Result;
}
Это будет выглядеть примерно так:
public abstract partial class OperatingWindowBase : Form
{
public void Execute()
{
// call this.OnExecute(); asyncronously so you can animate
}
protected abstract void OnExecute();
}
public class OperatingWindowFunc<T> : OperatingWindowBase
{
Func<T> operation;
public T Result { get; private set; }
public OperatingWindowFunc<T>(Func<T> operation)
{
this.operation = operation;
}
protected override OnExecute()
{
this.Result = operation();
}
}
public class OperatingWindowAction
{
Action operation;
public OperatingWindow(Action operation)
{
this.operation = operation;
}
protected override OnExecute()
{
operation();
}
}