ShowDialog后,调用异步,await还未等异步线程执行完毕,弹窗关闭了
问题描述: ShowDialog弹出了一个Form,然后在form中有点击button执行一个异步调用接口查询操作,等待查询结束后再做其他判断,结果异步还未执行完毕,form就执行了dispose关闭了。
原因:最终确定原因是在调用异步前面设置了DialogResult的值。当设置了DialogResult的值后,窗体将自动关闭,该逻辑在底层默认执行。此时,用await等待异步执行时,并没有占用主线程,然后窗体就关了。
解决办法: 想明白了原因后,解决起来就简单多了。可以把设置DialogResult的值放在await线程执行完毕后面;也可以将异步改成同步执行占住窗体主线程。
private async void Button1_ClickAsync(object sender, EventArgs e)
{
//还未执行完毕Form弹窗就关了
DialogResult = DialogResult.OK;
await aaa();
}
private async void Button2_Click(object sender, EventArgs e)
{
await aaa();
//执行完毕异步后在设置DialogResult值就ok了
DialogResult = DialogResult.OK;
}
/// <summary>
/// 异步线程
/// </summary>
/// <returns></returns>
private async Task<int> aaa()
{
await Task.Delay(2000);
MessageBox.Show("over");
return 1;
}