我编写了一组异步方法来处理大量的数据库提取和快速编译。在大多数情况下,这些工作非常棒,并且确实为我的软件创造了奇迹。然而,最近我遇到了一些方法的小问题:用户每次都会搞砸,软件之间的数据时间框架变得庞大,数据适配器在获取信息之前就会超时。通常在同步方法中你会使用try / catch来处理这些问题,但我试过这个无济于事。有没有办法异步处理异常以简单地抛出同步方法,所以我的捕获所有try / catch都可以正常工作?
这是我使用的数据适配器异步方法的一个示例:
private async Task<DataTable> WWQuery2Run
(string A, string B, string C, string D)
{
using ( var conn = new System.Data.SqlClient.SqlConnection(ReportResources.ConnString) )
{
var temp = new DataTable();
var DA = new SqlDataAdapter(string.Format(ReportResources.Instance.CureInfoQueries["WWQuery2"], A, B, C, D), conn);
await Task.Run(() => DA.Fill(temp));
return temp;
}
}
修改:
我意识到在尝试处理超时异常之后的所有麻烦,以这种方式工作不是一个好习惯。我继续前进并添加了一种方法来计算持续时间,然后输入显示的异步方法并警告用户长度并给他们一个中止编译的选项。有了这个,我将查询的超时时间增加到应该覆盖除了用户希望继续的最糟糕情况之外的所有情况。我还在程序中的项目描述中添加了一个计算的持续时间,这样他们就知道它在尝试查询和编译之前就已经很久了。
感谢 @Murad Garibzada 的帮助。
答案 0 :(得分:0)
您可以增加适配器命令超时,如下所示:
Allow multiple statements
处理例外:
SqlDataAdapter adapter= new SqlDataAdapter(strSQLString, conUS);
adapter.SelectCommand.CommandTimeout=120;
答案 1 :(得分:0)
除了增加命令超时外,您还可以使用try / catch块。由于您正在等待,因此在WWQuery2Run
完成之前,控件不会返回到您的调用代码。如果WWQuery2Run
抛出SomeException,它将被代码捕获并处理。
private async Task<DataTable> WWQuery2Run(string A, string B, string C, string D)
{
try
{
using ( var conn = new System.Data.SqlClient.SqlConnection(ReportResources.ConnString) )
{
var temp = new DataTable();
var DA = new SqlDataAdapter(string.Format(ReportResources.Instance.CureInfoQueries["WWQuery2"], A, B, C, D), conn);
await Task.Run(() => DA.Fill(temp));
return temp;
}
}
catch (SomeException ex)
{
// handle exception
}
}