Может быть, вы можете реализовать свой ProgressForm таким образом, чтобы он отображался async
, и дождаться его.
Пример реализации может выглядеть так:
public class ProgressForm : Form
{
private ProgressForm()
{
}
public static async Task ShowAsync(Form owner, Action<IProgress<(string Message, int Progress)>> action)
{
owner.Enabled = false;
try
{
using (var frm = new ProgressForm { StartPosition = FormStartPosition.CenterParent })
{
frm.Show(owner);
try
{
var progress = new Progress<(string Message, int Progress)>(frm.OnProgress);
await Task.Run(() => action(progress));
}
finally
{
frm.Close();
}
}
}
finally
{
owner.Enabled = true;
}
}
private void OnProgress((string Message, int Progress) args)
{
// Report progress to this ProgressForm here.
// This line is only for demonstration. Please add controls to the form.
this.Text = $@"{args.Message} {args.Progress}%";
}
}
Пожалуйста, имейте в виду, что это вызовет Show
вместо ShowDialog
. Владелец отключен, поэтому он ведет себя как модальная форма (только для этого родителя!).
Использование может выглядеть следующим образом:
private async void button1_Click(object sender, EventArgs e)
{
void DoSomeWork(IProgress<(string Message, int Progress)> progress = null)
{
var loops = 5;
for (var i = 0; i < loops; ++i)
{
progress?.Report(($"Loop {i + 1}", (i + 1) * 100 / loops));
Thread.Sleep(500);
}
throw new DivideByZeroException("...");
}
try
{
await ProgressForm.ShowAsync(this, DoSomeWork);
}
catch (DivideByZeroException)
{
MessageBox.Show("Yeah...");
}
}
Надеюсь, это поможет.
Этот код выполняет Thread.Sleep
в Task.Run
! Это только демонстрация, и мне нужен образец, который требует времени.