Winforms异步任务,一次运行多个线程而不阻止UI

时间:2016-08-10 08:01:06

标签: c# multithreading winforms asynchronous task

我是来自网络的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...
    }

1 个答案:

答案 0 :(得分:2)

您用来运行setTab1()的Invoke调用意味着代码在UI线程上运行,因此UI锁定的原因。

尝试在setTab1()中尽可能多地使用Invoke(),并且只有使用Invoke()运行代码才能在获得所需数据后更新UI。