异步等待,如何在 Windows 窗体中使用它们?

Async await, how to use them in a windows form?

提问人:Livio 提问时间:11/5/2023 最后编辑:Theodor ZouliasLivio 更新时间:11/6/2023 访问量:113

问:

string DBconnString = 
  "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Para1 + @"\Labo_be.mdb;";

var DBConn = new OleDbConnection(DBconnString);
DBConn.Open();

string S_Query = "Select * FROM DISEGNI";
cmd1 = new OleDbCommand(S_Query, DBConn);
DR = cmd1.ExecuteReader();

while (DR.Read())
{
    var sName = DR.GetString(DR.GetOrdinal("PARTNBR"));
    Combo_Dis.Items.Add(sName);
}

如何使用转换此子? 这个子加载了一个包含超过 35000 个抽奖号码的组合,因此应用程序非常非常慢async await

C# .NET Winforms 异步 await ado.net

评论

5赞 Klaus Gütter 11/5/2023
您不希望组合框中有 35000 个条目,是吗?
1赞 Maytham Fahmi 11/5/2023
在重新阅读了这个问题之后,出于好奇,在这种特殊情况下,您对异步等待解决的期望是什么?加载这么多记录当然会有副作用!
0赞 Aluan Haddad 11/5/2023
@MaythamFahmi 我敢肯定这是某些东西的副本,但你链接的问题的答案是错误的。
0赞 Aluan Haddad 11/5/2023
阅读这篇Microsoft文章,你就会知道答案:learn.microsoft.com/en-us/dotnet/framework/data/adonet/......
2赞 Theodor Zoulias 11/5/2023
如果你认为使你的代码异步,你也会让它运行得更快,你会失望的。异步编程旨在优化内存,有效利用线程。除非您的内存不足,否则不要指望任何速度提升。

答:

0赞 Dmitry Bychenko 11/5/2023 #1

如果您使用 WinForms,它会处于一个很慢的循环中(在我的工作站上大约 5 秒):当您添加新项目时,组合框应该进行一些计算(下拉列表大小)、重新绘制自身等。您只能使用一次来执行此额外工作:Combo_Dis.Items.AddBeginUpdate() .. EndUpdate()

using var DBConn = new OleDbConnection(
  $"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={Path.Combine(Para1, Labo_be.mdb)};"); 

DBConn.Open();

string S_Query = 
  @"SELECT PARTNBR 
      FROM DISEGNI";

using var cmd1 = new OleDbCommand(S_Query, DBConn);

using var dr = cmd1.ExecuteReader();

Combo_Dis.BeginUpdate();

try {
  while (dr.Read()) {
    Combo_Dis.Items.Add(dr[0]);
  }
}
finally {
  Combo_Dis.EndUpdate();
}

评论

3赞 Livio 11/5/2023
@dmitribychenko,太棒了!现在在我的工作站上,显示窗口的时间减少到大约 2-3 秒!非常感谢!!!!