newbie1992 Ответов: 2

Кросс-нить операции не действительна : C# для нарезания резьбы


Здравствуйте, друзья, я снова вызвал это сообщение,
может ли кто-нибудь из вас научить меня, как решить эту проблему?.

я пытаюсь запустить поток, чтобы получить информацию из Диспетчера задач
таким образом, я могу получить информацию о том, какой процесс в данный момент активирован, приостановлен или закрыт

ранее я вызвал то же самое сообщение об ошибке, попытавшись создать новый usercontrol с потоком, который ошибочен

в этом случае как мне изменить текст моей этикетки ??
потому что когда я попытаюсь изменить свой текст метки внутри потока, он вызовет это.

Что я уже пробовал:

<pre>private void detector() {
            while (true) {
                var mycafeclientPro = Process.GetProcessesByName("notepad");
                if (mycafeclientPro.Length > 0) {
                    foreach (Process p in mycafeclientPro) {
                        if (p.Responding) {
                            //statusPanel.BackColor = Color.FromArgb(190, 197, 209);
                            statusLabel.Text = "Application activated";
                            //statusLabel.ForeColor = Color.FromArgb(255, 255, 255);
                            //statusLabel.Location = new Point((statusPanel.Width - statusLabel.Width) / 2, (statusPanel.Height - statusLabel.Height) / 2);
                        }
                        else {

                        }
                    }
                }
                else {
                    
                }
            }
        }

2 Ответов

Рейтинг:
7

________________

delegate void  SetTextOnControl (Control controlToChange, string message);


			public void SetText(Control controlToChange, string message)
			{
				if (controlToChange.InvokeRequired)
				{
					SetTextOnControl DDD = new SetTextOnControl(SetText);
					controlToChange.Invoke(DDD, controlToChange, message);
				}
				else
				{
					controlToChange.Text = message;
				}
			}


Чем вызывать этот SetTexst из любого потока.


Рейтинг:
12

OriginalGriff

Вы не можете получить доступ к элементам пользовательского интерфейса (элементам управления, формам) вообще, за исключением потока, в котором они были созданы: поток пользовательского интерфейса. Если вы попытаетесь, то получите исключение перекрестного потока.
Итак этот код:

statusLabel.Text = "Application activated";
не может быть выполнен в Вашем "новом" потоке.

Чтобы решить эту проблему, либо
1) вызовите свой контроль: Контроль.Вызов Метода (Делегата) (System.Окна.Формы)[^]
Или
2) Используйте класс BackgroundWorker (Класс BackgroundWorker (System.ComponentModel)[^] и выполните обновления элемента управления в обработчике событий ProgressChanged.