我正在开始一些事件的背景。 我想知道是否有可能: 当我开始工作时,我可以在这个线程中开始一些新线程吗? 如果可能,它如何影响性能? 在我的应用程序中,我现在有三个线程,但我希望允许一个线程创建大约60个新线程。 为什么60? 我有60个复杂的控件,我想尝试控制它们到每个控件一个线程。
问候,格雷格
答案 0 :(得分:2)
可以从一个线程启动多个线程。但是,如果通过控件表示UI控件,我认为您需要在主UI线程中才能实际更新控件。
现在,线程可能能够修改主UI线程随后将应用于控件的一些数据,但要注意同步,它可能会变得非常混乱。
至于性能,线程意味着开销,因此根据您的应用程序,在后台只有一个线程处理60个控件的数据,并让UI线程更新控件也是有意义的。但这实际上取决于您的应用程序以及在后台获取和处理数据的方式。
答案 1 :(得分:0)
如前所述,如果您需要实施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);
}));
}