2009-08-10 9 views
4

Мне нужно убедиться, что после того, как выполнение попадает в метод, элемент управления, полученный этим методом, не изменяется другим потоком. В принципе, я думал, что в чем-то вроде этого:Заблокировать элемент управления winforms

private void doSomeWork(Control control) { 
    lock (control) { 
     // do some stuff with the control... 
    } 
} 

это плохая идея?

Edit:

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

ответ

3

В приложении с хорошим ведением элементы управления формами окон уже ограничены только одним потоком. Если какой-либо поток пытается получить доступ к элементу управления, созданному в другом потоке, будет выбрано исключение.

В коде нет ничего плохого. Просто знайте, что сейчас в основном бесполезно, если вы не взломали свой путь через защиту (что возможно).

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

0

На самом деле Фернандо, это неплохая идея, но это не правильный способ взглянуть на блокировку. Вы должны внимательно прочитать то, что делает замок заявление в .Net:

http://msdn.microsoft.com/en-us/library/c5kehkcz(VS.80).aspx

я думаю, что из вашего заявления вы ожидаете, что весь объект должен быть заблокирован, или каким-то образом сделать безопасным для нарезания резьбы, так как объект iteself используется в заблокированном блоке кода. Фактически случается, что блок кода заблокирован и не разрешен для выполнения двумя или более потоками одновременно. Если этот блок кода является единственным местом, в котором вы собираетесь работать с элементом управления, тогда вы в порядке, иначе вам нужно будет блокировать синхронизацию самого объекта.

0

Не имеют большой опыт работы с потоками, но, может быть, я предлагаю вам начать форму управления в новом потоке с помощью анонимного делегата:

t= new Thread(delegate() { 
    MyMethodToInvokeTheWinFormControl(); 
    }); 

t.Start(); 
0

Это полностью зависит от того, что вы подразумеваете под «не измененным».

Если ваше значение «любой другой поток не может изменить этот элемент управления вообще», то это не так, как работает замок.

Замок в этом смысле не похож на обычный замок на двери в дом. Это больше похоже на небольшую желтую заметку с надписью «Locked». Пока другие потоки читают заметку и соблюдают то, что она говорит, это должно быть хорошо, но любой другой поток, который не заботится о записке вообще, конечно, не будет препятствовать возиться с вашим контролем.

В любом случае, что именно вы пытаетесь достичь? Вы никогда не должны be беспорядок с элементами управления, отличным от основного потока, поэтому проблема не должна существовать в первую очередь.

Вместо этого вы должны сортировать все работы над элементом управления на основной нить с помощью метода Invoke на элементе управления.

Смежные вопросы