簡體   English   中英

使用dispatcher.invoke時程序凍結

[英]Program freeze while using dispatcher.invoke

我在數據庫中有多個類別(類別,子類別)。 我想將子類別放入普通類別中。 這是我的方法:

private void LoadCategories()
{
    connection = new MySqlConnection(conf.connection_string);
    MySqlCommand cmd = new MySqlCommand();
    cmd.Connection = connection;
    cmd.CommandText = "SELECT * FROM auftrags_typ_category";

    if (this.OpenConnection() == true)
    {
        try
        {
            MySqlDataReader reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                int categoryID = (int)reader["id"];
                #region Create Expander
                Expander cat_expander = new Expander();
                cat_expander.ExpandDirection = ExpandDirection.Right;
                TextBlock cat_name = new TextBlock();
                cat_name.Text = reader["name"].ToString();
                cat_name.RenderTransformOrigin = new Point(0.5, 0.5);
                cat_name.LayoutTransform = new RotateTransform() { Angle = 90 };
                cat_expander.Header = cat_name;

                Thread t = new Thread(() => LoadUnderCategories(categoryID));
                t.SetApartmentState(ApartmentState.STA);
                t.Start();
                t.Join();

                Border border = new Border();
                border.Width = 1;
                border.VerticalAlignment = VerticalAlignment.Stretch;
                border.SnapsToDevicePixels = true;
                border.Background = (Brush)FindResource("MaterialDesignDivider");

                cat_expander.Content = serviceList;
                serviceListSP.Children.Add(cat_expander);
                serviceListSP.Children.Add(border);

                serviceList.Items.Clear();
                #endregion
            }
        }
        catch (MySqlException ex)
        {
            MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
        }
    }
}    

我嘗試使用線程暫停代碼以調用LoadUnderCategories:

private void LoadUnderCategories(int categoryID)
{
    connection = new MySqlConnection(conf.connection_string);
    MySqlCommand cmd = new MySqlCommand();
    cmd.Connection = connection;
    cmd.CommandText = "SELECT * FROM auftrags_typ_childcategory WHERE category = @categoryID";
    cmd.Parameters.AddWithValue("@categoryID", categoryID);

    if (this.OpenConnection() == true)
    {
        try
        {
            MySqlDataReader reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                TreeViewItem child_category = new TreeViewItem();
                child_category.Header = reader["name"].ToString();
                Application.Current.Dispatcher.Invoke((Action)(() =>
                {
                    serviceList.Items.Add(child_category);
                }));

            }
        }
        catch (MySqlException ex)
        {
            MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
        }
    }
}

我聲明了TreeView serviceList = new TreeView(); 全球。

但是程序凍結了。 如果我使用Dispatcher.Invoke在程序凍結時如何訪問全局serviceList

@Felype在評論中寫道,使用BeginInvoke代替Invoke 這工作了。 該程序不再凍結。 謝謝。

我在評論中聲明為答案的另一個問題也通過以下方式解決:

TreeView serviceList = new TreeView();
Thread t = new Thread( () => LoadUnderCategories(categoryID, serviceList) );

private void LoadUnderCategories(int categoryID, TreeView serviceList)

希望那是正確的方法。

暫無
暫無

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

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