ѕолучение доступа к элементам управлени€ C# из потоков - решение

12:09:2013 –≥.

„асто в процессе разработки программы на C# WindowsForms требуетс€ получить доступ к элементу управлени€, который находитс€ в другом потоке, зачастую родительском, т.е. представл€ет собой элемент управлени€, созданный в конструкторе.

  сожалению, пр€мое обращение к элементам управлени€ формы C# доступно, но может привести к различным "глюкам", которые могут быть не очень очевидны. ѕоэтому стоит всегда пользоватьс€ безопасным методом обращени€, в случае, если вы заранее знаете, что собираетесь обращатьс€ к интерфейсу из потоков.

–ешение достаточно простое - дл€ обращени€ используйте специальную функцию с Invoke (проверка InvokeRequired ). ¬ примере ниже будет из потока устанавливатьс€ свойство ProgressBar-а - достаточно часта€ задача, котора€ стоит перед —# WindowsForms да и другими разработчиками дл€ оповещени€ пользовател€ о том, как продвигаетс€ процесс.

public void SetProgress(int value)
{
   if ( InvokeRequired )
   {
       this.Invoke(new Action(SetProgress), new object[] { value });
       return;
   }
   _PB_Progress.Value = value;
}

 ак видим, если требуетс€ безопасное обращени€ (т.е. мы находимс€ не в родительском потоке), то он вызывает сам себ€ из этого потока.

≈сли у нас несколько аргументов в функции (к примеру, обновл€ем DataGridView из потока), то все они должны перечисл€тьс€ через зап€тую в острых скобках <тип_параметра1, тип_параметра2> и точно так же через зап€тую в фигурных скобках - {значение1, значение2}. ≈стественно, в параметре Action указываем им€ нашей функции в C#, котора€ будет выполн€ть обращение к элементам управлени€ из другого потока.

 

ƒобавить комментарий


«ащитный код
ќбновить

« ƒобавление новой строки в DataGridView C# WindowsForms - пример  ак работать с RichTextBox C# пример »

‘отоальбом

fotic.jpg

ќблако “егов