【问题标题】:Run few thread from another thread从另一个线程运行几个线程
【发布时间】:2011-09-01 08:13:38
【问题描述】:

我正在为某个事件开始后台工作。 我想知道是否有可能: 当我开始工作时,我可以在这个线程中开始一些新线程吗? 如果可能,它对性能有何影响? 在我的应用程序中,我现在有三个线程,但我希望允许一个线程创建大约 60 个新线程。 为什么是60? 我有 60 个复杂的控件,我想尝试将它们的控制权交给每个控件一个线程。

问候,格雷格

【问题讨论】:

  • 这些是什么类型的控件? WPF?表格?只有创建控件的线程才能访问它(通常是单个 GUI 线程),因此每个控件都有一个线程可能没有多大用处。你想解决什么问题?
  • 如果这是winforms(或我认为是WPF),更改控件的属性需要在创建它们的线程上完成。此外,60 个线程似乎非常低效。

标签: c# multithreading


【解决方案1】:

可以从一个线程启动多个线程。但如果控件是指 UI 控件,我认为您需要在主 UI 线程中才能真正更新控件。

现在,线程可能能够修改主 UI 线程随后将应用于控件的一些数据,但要小心同步,它可能会变得非常混乱。

就性能而言,线程意味着开销,因此根据您的应用程序,在后台仅使用一个线程处理 60 个控件的数据并让 UI 线程更新控件也可能有意义。但这实际上取决于您的应用程序以及在后台获取和处理数据的方式。

【讨论】:

    【解决方案2】:

    如前所述,如果您需要实现 60 个线程来管理您的 UI 控件,那么您的设计很可能有问题。

    但是,在确定线程数时,您需要考虑争用和锁定机制等因素。例如,如果您的所有线程都使用具有大量读取和少量写入的共享数据,那么您应该考虑使用 ReaderWriterLockSlim 来管理访问(注意在任何情况下都不要使用重量级的 ReaderWriterLock 类)。或者,根据您的设计信号量或非阻塞同步方法在这里可能有用。

    在 WPF 中,如果您需要从后台线程访问 UI 控件,则可以使用 Dispatcher,如下所示:

    private void AddTbToStackPanel(string text)
    {
        Dispatcher.BeginInvoke(DispatcherPriority.Normal, (Action)(() =>
        {
            StackPanel stackPanel = stackPanel1 as StackPanel;
            TextBlock tb = new TextBlock();
            tb.Text = text;                
            stackPanel.Children.Add(tb);
        }));
    }
    

    【讨论】:

      猜你喜欢
      • 2012-04-25
      • 2012-06-22
      • 1970-01-01
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多