簡體   English   中英

UI 在運行任務和更新 ui 時僅部分響應

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

我有以下用戶界面 -

在此處輸入圖像描述

對於與 crm 的每條線路連接都應進行測試。 這是在單獨的線程中完成的。

然后在最后一列中更新與 crm 系統的連接的測試狀態。

問題在於,在線程運行和更新 ui 期間,ui 僅部分響應,即我想在更新時單擊這些行。

這是我的代碼:

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)
            {

            }
        }

在你的方法結束時,你有

Task.WaitAll(tasks.ToArray());

這將阻塞,直到所有任務完成。 您應該改用WhenAll

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

您還在幾個地方使用了result.Result ,這也會阻塞。 這應該被替換為等待任務,即await result

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM