【发布时间】:2018-11-15 15:21:25
【问题描述】:
在我的表单事件加载中,我调用了一个方法loadDg:
private void form_Load(object sender, EventArgs e)
{
loadDg();
}
和
private async Task loadDg()
{
pictureLoading.Visible = true;
await Task.Run(() => { string[] datas = db.row("select * from products");
string[] datas2 = db.row("select * from users");
double one = Convert.ToInt32(datas[0]);
label1.Text = one.toString();
//....
});
pictureLoading.Visible = false; //hide gif animation
}
在我的代码中,db.row 这个方法总是只返回 1 行(字符串数组),但我的 ui 仍然冻结,我尝试使用异步连续更新 UI 而不会在启动时冻结
【问题讨论】:
-
label1.Text = ...在非 ui 线程中不好。 -
@Sinatr 修复它的最佳方法是什么?
-
@Flydog57
loadDg不是“同步调用”。鉴于所显示的内容,它是一个异步方法,在显示的代码中完成之前没有任何内容是显式阻塞的,因此它将异步运行。将form_Load标记为async仅在您需要对异步方法的完成做出响应时才有用。在这种情况下,完成后什么都不做。 -
要修复
label1.Text =...问题,创建一个设置标签的小函数并使用Control.Invoke在拥有该控件的线程上调用该函数(请记住,Form 类是一个子类控制类)。有很多关于如何做到这一点的例子。
标签: c# .net winforms asynchronous async-await