Метод слишком долго выполняется

Странные стрнности происходят. Имею код:

        public FormSettings()
        {
            InitializeComponent();

            PlayerAdd += OnPlayerAdd;

            System.Diagnostics.Debug.WriteLine("settings Create");
        }


        private void OnDispose()
        {
            System.Diagnostics.Debug.WriteLine("settings dispose");
        }

        private void FormSettings_Load(object sender, EventArgs e)
        {
            System.Diagnostics.Debug.WriteLine("settings Load()");
            foreach (MonikerItem monikerItem in audioOutputMonikers)
            {
                comboBoxAudioRenderers.Items.Add(monikerItem.DisplayName);
            }
            tabControl2.SelectedTab = tabPageVideo;
            Left = -1000;
        }



        private void OnPlayerAdd(ZeratoolPlayerGui z, bool maximized)
        {
            z.Activated += OnPlayerActivate;

            string t = $"Player [{players.Count}]: {z.Title}";
            comboBoxPlayers.Items.Add(new PlayerListItem(z, t));
        }

        private void OnPlayerActivate(object sender)
        {
            System.Diagnostics.Debug.WriteLine("player activated in form settings");
            ZeratoolPlayerGui z = sender as ZeratoolPlayerGui;
            int id = FindPlayerInComboBox(comboBoxPlayers, z);
            if (comboBoxPlayers.SelectedIndex != id)
            {
                comboBoxPlayers.SelectedIndex = id;

                ListFilters(z.PlayerEngine);//<<<<слишком долго выполняется
                RefreshParameters(z);
            }
        }

        private void ListFilters(ZeratoolPlayerEngine playerEngine)
        {
            comboBoxSplittersAVI.Items.Clear();
            comboBoxSplittersAVI.Items.Add("Автоматически (перебор всех вариантов)");
            foreach (FilterItem item in playerEngine.filters.mediaSplittersAVI)
            {
                comboBoxSplittersAVI.Items.Add(item.DisplayName);
            }
            comboBoxSplittersAVI.SelectedIndex = playerEngine.filters.mediaSplitterAviId + 1;
            
            comboBoxSplittersMP4.Items.Clear();
            comboBoxSplittersMP4.Items.Add("Автоматически (перебор всех вариантов)");
            foreach (FilterItem item in playerEngine.filters.mediaSplittersMP4)
            {
                comboBoxSplittersMP4.Items.Add(item.DisplayName);
            }
            comboBoxSplittersMP4.SelectedIndex = playerEngine.filters.mediaSplitterMp4Id + 1;

            comboBoxSplittersOther.Items.Clear();
            comboBoxSplittersOther.Items.Add("Автоматически (перебор всех вариантов)");
            foreach (FilterItem item in playerEngine.filters.mediaSplittersOther)
            {
                comboBoxSplittersOther.Items.Add(item.DisplayName);
            }
            comboBoxSplittersOther.SelectedIndex = playerEngine.filters.mediaSplitterOtherId + 1;

            comboBoxVideoDecoders.Items.Clear();
            comboBoxVideoDecoders.Items.Add("Автоматически (перебор всех вариантов)");
            foreach (FilterItem item in playerEngine.filters.videoDecoders)
            {
                comboBoxVideoDecoders.Items.Add(item.DisplayName);
            }
            comboBoxVideoDecoders.SelectedIndex = playerEngine.filters.prefferedVideoDecoderId + 1;


            comboBoxVideoRenderers.Items.Clear();
            foreach (FilterItem item in playerEngine.filters.videoRenderers)
            {
                comboBoxVideoRenderers.Items.Add(item.DisplayName);
            }
            comboBoxVideoRenderers.SelectedIndex = playerEngine.filters.prefferedVideoRendererId;
        }
        public class FilterItem
        {
            private Guid guid;
            private string name;
            public string DisplayName => name;

            public FilterItem(Guid guid, string displayName)
            {
                this.guid = guid;
                this.name = displayName;
            }

            public Guid GetGuid()
            {
                return this.guid;
            }
        }

Форма FormSettings (в которой выполняется этот код) это глобальная статическая переменная. Создаётся сразу. Сейчас не надо о том, почему плохо так делать. Если форма никогда не была показана, то всё чётенько работает. А если форма была уже показана, то указанный метод выполняется ну просто оооочень тормознуто.
Я сначала подумал, что обработчиков на событие Activated слишком много (или оно несколько раз подряд приходит), но нет. Если закомментировать этот метод, то всё остальное мгновенно выполняется.

Так надо дальше смотреть что именно долго выполняется.
Наверно что-то в playerEngine.

Если бы там что-то тормозило, тогда бы на это не влиял факт открытой формы, верно? Оно бы тогда от формы не зависело.

public class ZeratoolPlayerEngine : Control
    {


        public class FiltersConfiguraion
        {
            public List<FilterItem> mediaSplittersAVI = new List<FilterItem>();
            public List<FilterItem> mediaSplittersMP4 = new List<FilterItem>();
            public List<FilterItem> mediaSplittersOther = new List<FilterItem>();
            public List<FilterItem> videoDecoders = new List<FilterItem>();
            public List<FilterItem> videoRenderers = new List<FilterItem>();


            public int mediaSplitterAviId;
            public int mediaSplitterMp4Id;
            public int mediaSplitterOtherId;
            public int videoDecoderId;
            public int prefferedVideoDecoderId;
            public int videoRendererId;
            public int prefferedVideoRendererId;





            public void Clear()
            {
                mediaSplittersAVI.Clear();
                mediaSplitterAviId = -1;

                mediaSplittersMP4.Clear();
                mediaSplitterMp4Id = -1;

                mediaSplittersOther.Clear();
                mediaSplitterOtherId = -1;

                videoDecoders.Clear();
                videoDecoderId = -1;
                prefferedVideoDecoderId = -1;

                videoRenderers.Clear();
                videoRendererId = -1;
                prefferedVideoRendererId = 0;
            }

            public void SetDefaults()
            {

                Clear();

                mediaSplittersAVI.Add(new FilterItem(CLSID_HaaliMediaSplitter, "Haali media splitter"));
                mediaSplittersAVI.Add(new FilterItem(CLSID_LAV_Splitter, "LAV splitter"));
                
                mediaSplittersMP4.Add(new FilterItem(CLSID_HaaliMediaSplitter, "Haali media splitter"));
                mediaSplittersMP4.Add(new FilterItem(CLSID_LAV_Splitter, "LAV splitter"));

                mediaSplittersOther.Add(new FilterItem(CLSID_HaaliMediaSplitter, "Haali media splitter"));
                mediaSplittersOther.Add(new FilterItem(CLSID_LAV_Splitter, "LAV splitter"));
                
                videoDecoders.Add(new FilterItem(CLSID_FFDShowVideoDecoder, "FFDShow video decoder"));
                videoDecoders.Add(new FilterItem(CLSID_LAV_VideoDecoder, "LAV video decoder"));
                //prefferedVideoDecoderId = 1;

                videoRenderers.Add(new FilterItem(CLSID_DefaultVideoRenderer, "Default video renderer"));
                videoRenderers.Add(new FilterItem(CLSID_VideoRenderer, "Video renderer"));
                videoRenderers.Add(new FilterItem(CLSID_EnhancedVideoRenderer, "Enhanced video renderer"));
                videoRenderers.Add(new FilterItem(CLSID_VideoMixingRenderer9, "Video mixing renderer 9 (VMR9)"));
                videoRenderers.Add(new FilterItem(CLSID_HaaliVideoRenderer, "Haali video renderer"));
                prefferedVideoRendererId = 0;
            }
        }

Тут тормозить-то нечему. Как на это влияет то что форма была однажды показана? :thinking: Формы это чудо какое-то. То мерцают, то тормозят.

Так оно ж видимо при открытии формы выполняется.

Если бы даже и так (а нет), то почему последующие вызовы этого метода начинают выполняться медленно? Как это связано-то?
256555945_0c45b2cffe60e27150c6fd405a17a462_800

Да ладно гнать на формы. Смотря как их приготовить.
В студии есть профилировщик. Посмотрите выделение памяти или ЦП. Может где то утечка. В АПИ очень нужно внимательно следить где то выделил и что уничтожил.

Так в этом и проблема. В этой части кода тормозить и утекать нечему (и уничтожать нечего). Оно ведь тормозит только если форма была однажды показана.

Это я еще даже не начал :grin:

Никогда не пользовался и не знаю как (буду гуглить). Видимо, настало время.

ну есть же отладчик. По шагам пройдитесь посмотрите где тормозит.
Есть Stopwatch замерьте время вычисления. Найдите узкое место и потом уже гуглить.
А так вообще не понятно что там да как…

Там доступно только использование памяти.

А смысл? :man_shrugging: Что даст замер времени? :thinking:
И так ведь понятно где и что медленно. Вопрос - почему.

Должно быть всё, в т.ч. и какие функции сколько времени заняли.

Measure CPU usage in your apps - Visual Studio (Windows) | Microsoft Docs
Analyze CPU usage in the Performance Profiler - Visual Studio (Windows) | Microsoft Docs

остальное не доступно

Это как?

вот так

Похоже тут нельзя сразу и память, и ЦП.

Я сделал как у вас на скриншоте. Он выдал список самых тормознутых методов. И дальше что? :man_shrugging: Причина их тормознутости всё-равно не ясна.

методы какие?

Два из них вызывают событие Activated, а третий вызывает событие, обработчик которого показывает форму.

Вы предлагаете гадать на кофейной гуще?? мало информации …
Все косяки как уже и говорилось из за неправильной постановки задачи. Проще наверное логику работы приложения продумать как следует чем в миллионах тем искать решения для тучи разных костылей.

Еще при пошаговом выполнении можно посмотреть где еще происходит выполнение потоков. Может быть изменение текущего выделенного элемента комбобокса порождает какое нибудь событие.

костыли приходится искать для решения самых простейших задач.
А что кажется сложным, часто довольно легко решается.

Попробуйте не в Activated сделать. А в другом методе. в конструкторе например