Я пытаюсь сделать какую-то работу над процессом backgroundworker, и пока работа сделана, я хочу отобразить модальное диалоговое окно. У меня есть код, хорошо работающий для простого делегата Action, но я хочу иметь возможность передать делегат Func и получить возвращаемый тип.
То, что у меня есть, это форма с методом
public void ShowDialogWhile(Action work)
{
_work = work;
_worker.RunWorkerAsync();
this.CenterForm();
this.ShowDialog();
}
То, что я хотел бы получить дальше, это что-то вроде
public TResult ShowDialogWhile<TResult>(Func<TResult> work)
{
_workWithReturn = work;
_worker.RunWorkerAsync();
this.CenterForm();
this.ShowDialog();
return (TResult)Result;
}
Пока что мне не повезло, потому что я продолжаю падать, когда объявляю тип моего _workWithReturn
Func<TResult> _workWithReturn;
У кого-нибудь есть мысли?
Вот полный код.
public partial class AsyncWaitDialog : Form, IAsyncDialog
{
BackgroundWorker _worker = new BackgroundWorker();
Action _work;
Func<TResult> _workWithReturn;
public object Result { get; private set; }
public AsyncWaitDialog()
{
InitializeComponent();
_worker.DoWork += HandleDoWorkEvent;
_worker.RunWorkerCompleted += HandleWorkerCompleted;
}
public void ShowDialogWhile(Action work)
{
_work = work;
_worker.RunWorkerAsync();
this.CenterForm();
this.ShowDialog();
}
public TResult ShowDialogWhile<TResult>(Func<TResult> work)
{
_workWithReturn = work;
_worker.RunWorkerAsync();
this.CenterForm();
this.ShowDialog();
return (TResult)Result;
}
private void HandleDoWorkEvent(object sender, EventArgs e)
{
try
{
if (_work != null)
{
_work();
}
if (_workWithReturn != null)
{
Result = _workWithReturn();
}
}
catch (Exception)
{
this.Close();
throw;
}
}
private void HandleWorkerCompleted(object sender, EventArgs e)
{
this.Close();
}
}