应用程序在尝试打开数据库连接时未处理事件



我正在Windows 10机器上用Visual Studio 2022用C#编写一个Windows窗体应用程序。该应用程序连接到Azure数据库,运行良好。我的问题是,有时连接需要几秒钟(可能10秒左右(,或者如果出现错误,它会一直到超时限制(通常为20到30秒(,然后返回任何错误消息。

在这段时间里,我试图向用户提供一些视觉反馈,但应用程序似乎没有处理任何事件,所以无论我试图发送什么类型的反馈,都要等到操作完成后才能完成(此时还没有定论(。

关于如何处理这个问题有什么想法吗?我需要在不同的线程上打开数据库吗?如果需要,每当我使用在不同线程上打开的数据库对象时,这会在应用程序的其余部分中成为问题吗?

我正在尝试一些简单的方法,比如逐渐添加一排点,比如:

private void InitCloudDatabase()
{
Boolean success = true;

WorkingTimer.Enabled = true;
WorkingTimer.Start();
try
{
AzureAgDatabase db = new AzureAgDatabase();
db.OpenConnection();
}
catch
{
success = false;
}
WorkingTimer.Stop();
pbCloudResult.Image = (success) ? Properties.Resources.icons8_done_96 :
Properties.Resources.Red_X___Fail;
}
private void WorkingTimer_Tick(object sender, EventArgs e)
{
lblCloud.Text += " .";
if (lblCloud.Text.Contains(" . . . . . . . . . . .")) 
{ 
lblCloud.Text = "Database Connection (Cloud)"; 
}
}

我以前并没有真正使用过Windows Forms,但在大多数基于UI的应用程序中,您应该保留UI线程用于UI操作,并将所有耗时的任务(计算或I/O(移动到不同的线程,以确保UI仍有响应。

在Windows窗体的情况下,看起来您有一个BackgroundWorker类,可以用来将DB操作卸载到该类中。以下是您可以参考的官方文档中的演练。

另一种方法是使用Task类异步运行数据库代码,与第一种方法相比代码更少。您只需在Task.Run调用中包装需要时间的语句,并在继续任务中包含后续语句。

最新更新