【发布时间】:2017-01-13 21:51:57
【问题描述】:
我想知道为什么这个Click 事件中的异常没有被捕获?除了statusLabel 向用户显示进程的状态之外,代码中没有任何花哨的东西。 myDataTable 是一个局部变量;目标是将结果分配给它。
GetDataTable 也必须是异步的吗?
public DataTable GetDataTable(string connectionString, string cmdText)
{
DataTable dt = new DataTable();
using (SqlConnection conn = new SqlConnection(connectionString)) {
using (SqlCommand comm = new SqlCommand(cmdText, conn)) {
conn.Open();
dt.Load(comm.ExecuteReader);
return dt;
}
}
}
private async void Button1_Click(object sender, EventArgs e)
{
try {
statusLabel.Text = "Processing...";
Task<DataTable> dtTask = Task.Run(() => GetDataTable(connectionString, commandText));
await dtTask;
myDataTable = dtTask.Result;
statusLabel.Text = "Done!";
} catch (Exception ex) {
MessageBox.Show("Error");
}
}
更新
我设法通过使GetDataTable() 返回DataTable 的Task 并将.Open 和.ExecuteReader 更改为它们的异步对应项来解决这个问题。对于另一种方法,Try 块内的那三行我减少为一行:
myDataTable = await GetDataTable(connectionString, commandText);
感谢大家的耐心等待!
【问题讨论】:
-
您正在使用 Result 属性 .. 还不如不使用 Task ..
-
我假设问题是在非异步方法上使用 await。我可以准确地分析发生了什么(因此是评论而不是答案)。您可以完全删除该行或使用 GetAwaiter().GetResult() 代替该行和下一行。见stackoverflow.com/questions/16877262/… 和stackoverflow.com/questions/17284517/…
-
或者正如 G-Man 所说,如果您正在同步等待结果,甚至不要使用任务。
-
@G-Man,不过,在分配
myDataTable = dtTask.Result之前,他正在等待dtTask。所以它仍然是异步的。与myDataTable = await dtTask基本相同。 -
@AwonDanag 我无法在我的测试代码中重现您的问题。您确定
GetDataTable()是在抛出异常还是您没有吞下它?如果出于测试目的,您将GetDataTable()的内容替换为仅抛出异常会怎样?
标签: c# async-await try-catch