我有这个代码从SQL Server获取表数据:
public static System.Data.Linq.Table<Equipment> GetEquipmentTable()
{
DataClassesDataContext dc = new DataClassesDataContext();
return dc.GetTable<Equipment>();
}
我有一个按钮来调用此函数:
private void button_Click(object sender, RoutedEventArgs e)
{
MyListView.DataContext = GetEquipmentTable();
}
我的问题是:当我禁用我的应用程序和SQL Server计算机之间的通信然后单击此按钮时,需要一段时间才能抛出一个异常,即连接到数据库是不可能的!我的主要问题是我的应用程序冻结,直到此异常累积。
我错过了什么吗?
更新1:
我使用异步并等待基于Rahul解决方案
public static async Task<System.Data.Linq.Table<Equipment>> GetEquipmentTable()
{
DataClassesDataContext dc = new DataClassesDataContext();
return dc.GetTable<Equipment>();
}
private async void button_Click(object sender, RoutedEventArgs e)
{
MyListView.DataContext = await GetEquipmentTable();
}
但仍在等待这行代码:
return dc.GetTable<Equipment>();
和UI也会冻结。
我认为dc.gettable&lt;&gt;不是等待或其他的东西!! ??
答案 0 :(得分:3)
当我禁用我的应用程序和SQL Server计算机之间的通信时 然后单击此按钮
这很明显,因为它试图连接到机器(在连接字符串中提到的Timeout内),然后一旦发现服务器无法访问就抛出异常。
主要问题是我的应用程序冻结,直到此异常累积
可能在这种情况下,将方法设为async
方法,如
public static async Task<System.Data.Linq.Table<Equipment>> GetEquipmentTable()
{
DataClassesDataContext dc = new DataClassesDataContext();
return dc.GetTable<Equipment>();
}
您的事件处理程序
private async void button_Click(object sender, RoutedEventArgs e)
{
MyListView.DataContext = await GetEquipmentTable();
}
答案 1 :(得分:0)
你有两个问题,app冻结是因为你没有使用异步编程 连接异常之前的延迟是因为客户端应用程序等待连接超时计时器结束(默认为30秒)。
尝试在数据库调用上使用async await来释放UI。
尝试在连接字符串中将连接超时更改为5秒。
更改连接字符串:
"Data Source=...;Connect Timeout=5"
答案 2 :(得分:0)
在Rahul的回答中使用await。 +1
您还可以测试一个简单的SqlConnection.Open
private static bool OpenSqlConnection(string connectionString)
{
bool return = false;
try
{
SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
return = true;
}
catch (Exception ex)
{
return = false;
}
finally
{
connection.Close();
}
return return;
}
SqlConnection con = new SqlConnection("connection string");
bool resp = false;
try
{
con.OpenAsync();
resp = true;
}
catch (SqlException ex)
{
//use the ex message
resp = false;
}
catch (Exception ex)
{
resp = false;
}
finally
{
con.Close();
}