簡體   English   中英

如何防止C#WPF中的UI掛起?

[英]How can you prevent UI in C# WPF from hanging?

我有一個C#腳本,可連接到遠程服務器並顯示本地組的所有成員。 該腳本正在運行,但是在搜索/連接到服務器時掛起。

我在WPF中具有以下必填字段:

  1. ServerList(組合框)
  2. UserAccess(文本框多行)
  3. DataGridResult(用於輸出的DataGrid)

這是我的異步/等待腳本,但仍然掛起:

private async void ButtonRun_Click(object sender, EventArgs e)
{
    if (UserAccess.SelectedItem == null)
    {
        MessageBox.Show("What Access are we going to display?");
        return;
    }

    string[] separate = new string[] { "\r\n" };
    string[] strServers = ServerList.Text.Split(separate, StringSplitOptions.RemoveEmptyEntries);

    if (strServers == null || ServerList.Text == "")
    {
        MessageBox.Show("There are no Servers Defined!");
        return;
    }

    int strServersCount = ServerList.LineCount;

    DataTable temptable = new DataTable();
    temptable.Columns.Add("Server");
    temptable.Columns.Add("Comments");

    ButtonRun.IsEnabled = false;

    await Task.Run(() =>
    {
        this.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() =>
            {
                for (var i = 0; i <= strServersCount - 1; i++)
                {
                    try
                    {
                        DirectoryEntry directoryServers = new DirectoryEntry("WinNT://" + strServers[i] + ",computer");
                        DirectoryEntry directoryGroup = directoryServers.Children.Find(UserAccess.Text + ",group");
                        object members = directoryGroup.Invoke("members", null);

                        foreach (object GroupMember in (IEnumerable)members)
                        {
                            DirectoryEntry directoryMember = new DirectoryEntry(GroupMember);
                            Console.WriteLine(directoryMember.Name + " | " + directoryMember.Path);
                            temptable.Rows.Add(strServers[i], directoryMember.Name + " | " + directoryMember.Path);
                        }

                    }
                    catch (Exception ex)
                    {
                        temptable.Rows.Add(strServers[i], "Error: " + ex.InnerException + " | " + ex.Message);
                    }
                    DataGridResult.ItemsSource = temptable.DefaultView;
                    ButtonRun.IsEnabled = true;
                }
            }));
    });
}

嘗試解決此問題,未經測試:

    string userAccessText = UserAccess.Text;
    await Task.Run(() =>
    {
        //this.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() =>
        //        {
                    for (var i = 0; i <= strServersCount - 1; i++)
                    {
                        try
                        {
                            DirectoryEntry directoryServers = new DirectoryEntry("WinNT://" + strServers[i] + ",computer");
                            DirectoryEntry directoryGroup = directoryServers.Children.Find(userAccessText + ",group");
                            object members = directoryGroup.Invoke("members", null);

                            foreach (object GroupMember in (IEnumerable)members)
                            {
                                DirectoryEntry directoryMember = new DirectoryEntry(GroupMember);
                                Console.WriteLine(directoryMember.Name + " | " + directoryMember.Path);
                                temptable.Rows.Add(strServers[i], directoryMember.Name + " | " + directoryMember.Path);
                            }

                        }
                        catch (Exception ex)
                        {
                            temptable.Rows.Add(strServers[i], "Error: " + ex.InnerException + " | " + ex.Message);
                        }
                      //  DataGridResult.ItemsSource = temptable.DefaultView;
                     //   ButtonRun.IsEnabled = true;
                    }
           //     }));  // End of Invoke
    });  

    DataGridResult.ItemsSource = temptable.DefaultView;
    ButtonRun.IsEnabled = true;

基本思想是將所有非GUI內容放入Task中,然后在等待該Task之后將其消耗在異步OnClick方法中。

暫無
暫無

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

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