Здесь есть две точки:
Конструктор вашей формы не может иметь модификатор async
.В качестве альтернативы вы можете использовать Load
событие .
(Необязательно) Вам не нужно передавать экземпляр "родительской" формыв конструктор, вы можете получить его непосредственно из свойства Owner
, если вы используете ShowDialog(this)
вместо ShowDialog()
.
Кроме того, не забудьте утилизировать любую диалоговую форму после того, как выс этим покончено.Предпочтительно, оберните его использование в using
блок .
Вот как я бы это сделал;В форме TaskObject
:
internal async Task<bool> LongFunction()
{
// Do some magic.
// await ...
return true;
}
public void MyFunc()
{
using (MyDialog d = new MyDialog())
{
d.ShowDialog(this);
}
}
В форме MyDialog
:
private async void MyDialog_Load(object sender, EventArgs e)
{
TaskObject owner = this.Owner as TaskObject;
await owner.LongFunction();
when_task_completes();
}
Если вы также хотите отслеживать ход выполнения LongFunction
, вы можетедобавьте к нему параметр Progress<T>
и используйте его так:
internal async Task<bool> LongFunction(IProgress<string> progress)
{
// Do some magic.
progress.Report("Something interesting");
// await ...
// More magic.
return true;
}
Тогда вы можете сделать что-то вроде этого:
private async void MyDialog_Load(object sender, EventArgs e)
{
TaskObject owner = this.Owner as TaskObject;
var progress = new Progress<string>(s => when_LongFunction_does_something_interesting(s));
await owner.LongFunction(progress);
when_task_completes();
}
void when_LongFunction_does_something_interesting(string message)
{
this.MyTextBox.Text = message;
}
Обратите внимание, что я использовалProgress<string>
в качестве примера.Вместо string
вы можете использовать любой тип, наиболее подходящий для вашей ситуации.