简体   繁体   English

UI 在运行任务和更新 ui 时仅部分响应

[英]UI only partly responsive while running tasks and updating ui

i have the following ui -我有以下用户界面 -

在此处输入图像描述

For each line connection to crm should be tested.对于与 crm 的每条线路连接都应进行测试。 This is done in separate thread.这是在单独的线程中完成的。

The test status of the connection to crm system is then updated in last column.然后在最后一列中更新与 crm 系统的连接的测试状态。

The problem is that the ui is only partly reponsive during threads run and updating of the ui, ie i would like to click through the lines whilst updating.问题在于,在线程运行和更新 ui 期间,ui 仅部分响应,即我想在更新时单击这些行。

Here is my code:这是我的代码:

private async void btnTestAllConnections_Click(object sender, EventArgs e)
        {
            await TestConnectionsAsync();
        }

        private async Task TestConnectionsAsync()
        {
            try
            {
                int idxConn = columnLookup[ColumnIndex.Connection].Index;

                if (lvInitParameters.Items.Count == 0)
                    return;

                ManagedConnection connection = null;

                btnTestAllConnections.Visible = false;
                btnTestConnection.Visible = false;
                panel2.Enabled = false;
                panel3.Enabled = false;
                tableLayoutPanel1.Enabled = false;
                btnCancelTest.Visible = true;

                List<Task> tasks = new List<Task>();

                var cts = new CancellationTokenSource();
                CancellationToken token = cts.Token;

                foreach (ListViewItem lvi in lvInitParameters.Items)
                {
                    InitParamProxy currentProfile = (InitParamProxy)lvi.Tag;

                    lvi.SubItems[idxConn].Text = "Testing...";

                    Task<bool> result =null;

                    try
                    {

                        result = Task.Run(
                  () =>
                 {
                     try
                     {
                         connection = currentProfile.ManagedConnection;
                         return connection?.ConnectionSuccess ?? false;
                     }
                     catch (Exception ex)
                     {
                         // crm exception
                         return false;
                     }
                 }, token);
                        if (token.IsCancellationRequested)
                        {
                            Console.WriteLine("\nCancellation requested in continuation...\n");
                            token.ThrowIfCancellationRequested();
                        }


                        ListViewItem testItem =
                        items.Where(si => ((InitParamProxy)lvi.Tag).ProfileKey.Equals(((InitParamProxy)si.Tag).ProfileKey)).SingleOrDefault();


                        lvi.SubItems[idxConn].Text = (result.Result) ? "Success" : "Fail";

                        if (testItem != null)
                            testItem.SubItems[idxConn].Text = (result.Result) ? "Success" : "Fail";
                    }
                    catch
                    {
                        ListViewItem testItem =
                            items.Where(si => ((InitParamProxy)lvi.Tag).ProfileKey.Equals(((InitParamProxy)si.Tag).ProfileKey)).SingleOrDefault();

                        lvi.SubItems[idxConn].Text = "Canceled";

                        if (testItem != null)
                            testItem.SubItems[idxConn].Text = "Canceled";
                    }

                    tasks.Add(result);
                }

                Task.WaitAll(tasks.ToArray());

                btnTestAllConnections.Visible = true;
                btnTestConnection.Visible = true;
                panel2.Enabled = true;
                panel3.Enabled = true;
                tableLayoutPanel1.Enabled = true;
                btnCancelTest.Visible = false;
            }
            catch (Exception)
            {

            }
        }

In the end of your method you have在你的方法结束时,你有

Task.WaitAll(tasks.ToArray());

This will block until all tasks are done.这将阻塞,直到所有任务完成。 You should instead use WhenAll您应该改用WhenAll

await Task.WhenAll(tasks.ToArray());

You are also using result.Result in several places, and this also blocks.您还在几个地方使用了result.Result ,这也会阻塞。 This should be replaced by awaiting the task, ie await result这应该被替换为等待任务,即await result

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM