ARi*_*101 2 c# asynchronous sqldataadapter
我编写了一组异步方法来快速处理大量数据库拉取和编译。在大多数情况下,这些工作都很棒,并且真的为我的软件创造了奇迹。然而,最近我遇到了一个关于这些方法的小问题:用户时不时地搞砸,软件在两者之间提取数据的时间框架变得巨大,数据适配器在获取信息之前超时。通常在同步方法中,您会使用 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;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
在尝试处理超时异常的所有麻烦之后,我意识到以这种方式工作并不是一个好习惯。我继续添加了一个方法来计算持续时间,然后再进入显示的异步方法并警告用户长度,并为他们提供中止编译的选项。有了这个,我将查询的超时时间增加到一个数量,如果用户希望继续,那么应该涵盖除最坏情况中的最坏情况之外的所有情况。我还在程序中项目的描述中添加了一个计算出的持续时间,以便他们知道在尝试查询和编译之前它已经进行了很长时间。
谢谢@Murad Garibzada的帮助。
除了增加命令超时,您还可以使用 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
}
}
Run Code Online (Sandbox Code Playgroud)