在async方法完成执行之前,不要再执行任何代码。请让我知道如何实现它。
以下是示例代码:
// Parent Form code
private void btnOpenForm1_Click(object sender, EventArgs e)
{
Form1 form1 = new Form1();
var result = form1.ShowDialog();
if (result == System.Windows.Forms.DialogResult.OK)
{
// do something
}
}
// Child form code
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
DialogResult result = MessageBox.Show(string.Format("Do you want to save changes?", "Confirmation", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);
if (result == System.Windows.Forms.DialogResult.Cancel)
{
e.Cancel = true;
}
else
{
if (result == DialogResult.Yes)
{
e.Cancel = true;
this.DialogResult = System.Windows.Forms.DialogResult.OK;
// HERE I NEED TO WAIT COMPULSARILY TILL THE OPERATION IS COMPLETED, NO NEXT STATEMENT SHOULD BE EXECUTED (NEITHER IN PARENT FORM)
var isSaveCompleted = await HandleSave().ConfigureAwait(false);
if(isSaveCompleted == true)
{
// dispose some objects
}
}
else // if No is clicked
{
this.DialogResult = System.Windows.Forms.DialogResult.Cancel;
// dispose some objects
}
}
}
public async Task<bool> HandleSave()
{
await doWork();
//
// some code here
//
}
public doWork()
{
//
// some code for I/O operation
//
}
在上面的代码中,我不希望在HandleSave()方法完成执行之前执行任何下一个语句(甚至不在父表单中)。
答案 0 :(得分:1)
这里有一个XY problem。试图强制异步方法同步运行以阻止关闭表单是错误的解决方案。
您需要弄清楚如何使用它们,而不是与窗口生命周期作斗争。这种情况的一个解决方案是隐藏表单而不是关闭表单;然后在异步保存完成时实际关闭它。您可以使用TaskCompletionSource<DialogResult>