【问题标题】:Load WPF Combobox on a separate thread [duplicate]在单独的线程上加载 WPF Combobox [重复]
【发布时间】:2014-07-25 14:33:19
【问题描述】:

我正在尝试使用数据库中的表加载此组合框,一切正常,但记录很多,加载需要一分钟。我想把它移到一个单独的线程,但我不断得到交叉线程。我认为交叉线程正在发生 b/c 组合框在 ui 线程上。有谁知道实现这一目标的简单方法。

谢谢迈克尔

private void BindComboBox()
{
        SqlConnection con = Program.GetConnection;
        SqlDataAdapter da = new SqlDataAdapter("SELECT ContactId, FullName FROM dbo.Contact WHERE FULLNAME IS NOT NULL", con);
        DataSet ds = new DataSet();
        da.Fill(ds, "dbo.Contact");

        SearchBOX.ItemsSource =  ds.Tables[0].DefaultView;
        SearchBOX.DisplayMemberPath = ds.Tables[0].Columns["FullName"].ToString();
        SearchBOX.SelectedValuePath = ds.Tables[0].Columns["ContactId"].ToString();
        SearchBOX.IsEnabled = true;
}

【问题讨论】:

  • 围绕 UI 操作使用 Dispatcher.BeginInvoke。更好的是,只需绑定 ItemsSource 并在新线程中更新支持属性。
  • 天哪,感谢您的回复
  • 可以使用后台工作者在另一个线程上加载数据。然后在完成事件中将数据绑定到 UI 控件。只有主线程可以访问 UI 控件。那么你在 backgroundoworker 上的空白行上方是什么。
  • 为什么不利用 WPF 最强大的方面之一 - 数据绑定?

标签: c# wpf wpf-controls


【解决方案1】:

我会提到可能的解决方案

  1. Dispatcher.Invoke 用于顺序调用或 Dispatcher.BeginInvoke 用于异步
  2. 新话题

    var thread = new Thread(new ThreadStart(delegate{ code to update }));
    

不建议这样做,因为创建单个线程会消耗大量时间和内存,而是使用此

ThreadPool.QueueUserWorkItem(new WaitCallback(delegate
                {

                }));

它创建线程,当它完成它的工作时,它把他带回池,他的状态变为空闲,当新方法被添加到池中时,不会自动创建线程,但它从寻找空闲线程开始,然后唤醒他起来。不要在其中放置耗时的方法,因为它可能会导致几个线程正在运行而其他线程在空闲等待。

3.另一个出路是BackgroundWorker。它使用 SynchronizationContext 在普通线程和 UI 线程之间切换。

        var worker = new BackgroundWorker();
        worker.DoWork += worker_DoWork;
        worker.WorkerReportsProgress = true;
        worker.ProgressChanged += worker_ProgressChanged;
        worker.RunWorkerCompleted += worker_RunWorkerCompleted;
        worker.RunWorkerAsync();

方法 ProgressChanged 和 RunWorkerCompleted 在 UI 线程上工作。顺便说一句,Backgroundworker 使用 ThreadPool。线程设置为后台线程(这意味着当您关闭应用程序时,线程也将被关闭)。避免在 UI 线程上冻结线程。考虑不要在开始时加载所有内容,而是在列表框中向下滚动时逐渐加载。

【讨论】:

    【解决方案2】:

    试试这个:

     Dispatcher.Invoke(new Action(() =>
        {
            // Your combo items loading code here
        }));
    

    【讨论】:

      猜你喜欢
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2019-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多