我是来自网络的Winforms的新手,我试图了解异步调用。
我有一个下拉列表,我想调用一些方法来更新我页面上的3个标签。我想以异步方式进行这些操作,因此它不会阻止用户界面,并加载“正在加载...”。每个选项卡上的消息,并将它们彼此独立地加载,用户可以仍然单击每个选项卡并查看加载的进度。
我有以下内容,但是这仍然是锁定用户界面,有人能指出我正确的方向我错了吗?
这是我的下拉事件处理程序
private async void ddlRoles_SelectedIndexChanged(object sender, EventArgs e)
{
await Task.Run(async () =>
{
await setTab1();
});
await Task.Run(async () =>
{
await setTab2();
});
await Task.Run(async () =>
{
await setTab3();
});
}
这是我想要异步运行的一个任务的示例。
private async Task setTab1()
{
if (tabl1Panel.InvokeRequired)
{
this.Invoke(new MethodInvoker(async delegate ()
{
await setTab1();
}));
return;
}
// LONG RUNNING CODE HERE...
}
答案 0 :(得分:2)
您用来运行setTab1()的Invoke调用意味着代码在UI线程上运行,因此UI锁定的原因。
尝试在setTab1()中尽可能多地使用Invoke(),并且只有使用Invoke()运行代码才能在获得所需数据后更新UI。