Как мы можем определить, имеет ли доступ элемент управления winform основным потоком или рабочим потоком, чтобы написать функциональность InvokeRequired? - PullRequest
0 голосов
/ 16 ноября 2018

Я получаю следующее исключение при запуске приложения 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();
                    }
                   }

1 Ответ

0 голосов
/ 16 ноября 2018

Ошибка компилятора CS0149 ' Ожидаемое имя метода ' говорит ' При создании делегата укажите метод. '

В качестве опции, используя делегат Action, вы можете упростить код следующим образом:

Action action = () => {/* UI Operations */};
if (this.InvokeRequired)
    this.Invoke(action);
else
    action.Invoke();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...