【发布时间】:2021-10-06 11:34:02
【问题描述】:
private void buttonLoad_Click(object sender, EventArgs e)
{
DataTable dt = new DataTable(); //create datatable with 6000 records
dt.Columns.Add("Name");
dt.Columns.Add("Value");
for (int i = 0; i < 2000; i++)
{
dt.Rows.Add("Tim", "955");
dt.Rows.Add("Rob", "511");
dt.Rows.Add("Steve", "201");
}
dataGridView1.DataSource = dt;
}
private async void btnSend_Click(object sender, EventArgs e)
{
progressBar1.Minimum = 1;
progressBar1.Maximum = dataGridView1.Rows.Count;
progressBar1.Value = 1;
progressBar1.Step = 1;
List<Task> lstTasks = new List<Task>();
DataTable dt = (DataTable)dataGridView1.DataSource;
System.Diagnostics.Stopwatch s = new System.Diagnostics.Stopwatch();
s.Start();
foreach (DataRow dr in dt.Rows)
{
lstTasks.Add(CallAPIAsync(dr));
}
await Task.WhenAll(lstTasks);
MessageBox.Show(s.ElapsedMilliseconds.ToString());
}
private async Task CallAPIAsync(DataRow dr)
{
try
{
await Task.Delay(2000); //simulate post api request that will pass dr[name] and dr[value]
if (new Random().Next(0,100)>95) //simulate error in the above request
{
throw new Exception("Test!");
}
}
catch (Exception e)
{
Thread.Sleep(1);//similate sync processing that takes 1ms
}
progressBar1.PerformStep();
}
在buttonLoad_Click 我正在将示例数据加载到数据表中。
在btnSend_Click 我正在模拟一个异步任务。
在异步任务中,如果你改变了的值
if (new Random().Next(0,100)>95)
到
if (new Random().Next(0,100)>5)
为了模拟更多的异常,即使catch块只需要1ms,代码也会运行缓慢。
当涉及到异常处理时,为什么 async await 很慢而且阻塞?
【问题讨论】:
-
想到了上下文切换开销。
-
你能显示你正在比较的同步代码吗
-
如果要阻止等待 Db 操作,该任务不会执行任何其他重要职责。
-
您也可以尝试将“成功”调用移到 try/catch 之后,并将 return 放在 catch 块内。
-
当抛出更多异常时,代码会变慢多少?你能分享一些指标吗?
标签: c# asynchronous async-await