在异步方法完成执行之前不要执行任何进一步的代码

时间:2015-07-14 14:24:04

标签: c# async-await

在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()方法完成执行之前执行任何下一个语句(甚至不在父表单中)。

1 个答案:

答案 0 :(得分:1)

这里有一个XY problem。试图强制异步方法同步运行以阻止关闭表单是错误的解决方案。

您需要弄清楚如何使用它们,而不是与窗口生命周期作斗争。这种情况的一个解决方案是隐藏表单而不是关闭表单;然后在异步保存完成时实际关闭它。您可以使用TaskCompletionSource<DialogResult>

启用父表单以检测实际关闭子表单的时间