我最近发现了C#的await
和async
关键字,并且一直试图在我的一些项目中使用它们。但是,我的一个表单开始意外关闭。我已经能够在下面的示例代码中复制该问题:
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
(new Form1()).ShowDialog();
Console.WriteLine("Done");
}
}
这是一个仅包含onClick
事件与button1_Click
相关联的按钮的表单。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private async void button1_Click(object sender, EventArgs e)
{
Visible = false;
using (SqlConnection conn = new SqlConnection("Data Source=TestDb;Integrated Security=SSPI"))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand("SELECT NULL", conn))
{
await cmd.ExecuteNonQueryAsync();
}
}
Console.WriteLine("Test");
Visible = true;
}
}
当我运行它并单击按钮时,我可以退到await cmd.ExecuteNonQueryAsync()
行,但是执行跳转到Main()
方法并在退出之前将“完成”写入控制台。如果我不使表单不可见,如果我使用Application.Show
而不是ShowDialog()
来调用它,或者我使用cmd.ExecuteNonQuery().Wait()
或cmd.ExecuteNonQuery()
而不是{{1} }}关键字,按钮按预期工作,表单不关闭。是什么导致表格意外关闭?