[英]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.