Я получаю следующее исключение при запуске приложения Windows Forms
System.InvalidOperationException: «Операция с несколькими потоками недопустима: элемент управления« MSPerformanceLabel »доступен из потока, отличного от потока, в котором он находитсябыл создан на. '
Я понял из исключения, а также из потокобезопасной документации, когда поток, который не создает элемент управления (рабочий поток) и пытается изменить элемент управления в этот размы получаем это исключение.
Но как мы можем определить, осуществляется ли доступ к элементу управления основным потоком или рабочим потоком, чтобы я мог использовать функциональность InvokeRequired?
Потому что в моем случае я использую элемент управления MSPerformanceLabel в моем файле проекта C # PowerChuteForm.cs и прохожу следующую строку:
MSPerformanceLabel.BackColor = Color.Transparent;
Здесь я не делалНе могу получить ошибку для элемента управления «MSPerformanceLabel»
Затем в строке ниже я получаю исключение:
MSPerformanceLabel.Enabled = false;
Итак, основываясь на исключении, которое я добавилфункциональность InvokeRequired:
Ниже приведен фрагмент кода:
MSPerformanceLabel.BackColor = Color.Transparent;
if (MSPerformanceLabel.InvokeRequired)
{
UpdateUIOnStateChanged updateObj = new UpdateUIOnStateChanged(MSPerformanceLabel.Enabled = false);
MSPerformanceLabel.Invoke(updateObj);
}
else
{
MSPerformanceLabel.Enabled = false;
}
MSPerformanceLabel объявлен в файле PowerChuteForm.Designer.cs, как показано ниже:
private System.Windows.Forms.Label MSPerformanceLabel;
И делегат объявляется в файле PowerChuteForm.cs, как показано ниже:
внутренний делегат void UpdateUIOnStateChanged ();
Но даже вФункция InvokeRequired, она показывает ошибку в параметре, который я передал функции "UpdateUIOnStateChanged".
Ошибка
«Ожидается имя метода»
Так как передать MSPerformanceLabel.Enabled = false;
в функцию.
IЯ новичок в C # и приложениях для Windows.Пожалуйста, помогите мне решить проблему.
Ниже мой обновленный код:
private void SetMSPerformanceLabel()
{
MSPerformanceLabel.Enabled = false;
}
MSPerformanceLabel.BackColor = Color.Transparent;
if (MSPerformanceLabel.InvokeRequired)
{
UpdateUIOnStateChanged updateObj = new
UpdateUIOnStateChanged(this.SetMSPerformanceLabel);
MSPerformanceLabel.Invoke(updateObj);
}
else
{
this.SetMSPerformanceLabel();
}
}