锁定winforms控件

时间:2009-08-10 02:01:52

标签: c# winforms controls thread-safety locking

我需要确保,一旦执行命中方法,此方法接收的控件不会被另一个线程更改。 基本上,我想到这样的事情:

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

这是个坏主意吗?

修改

实际上,我正在尝试做的是确保在执行某些控件的方法(顺便说一下,将通过反射执行)时,控件不会被另一个线程处理掉。

4 个答案:

答案 0 :(得分:3)

在性能良好的应用程序中,Windows窗体控件仅限于一个线程。如果任何线程试图访问在不同线程中创建的控件,则会抛出异常。

您的代码没有任何问题,只是知道现在它主要无用,除非您正在通过保护方式进行攻击(这是可能的)。

通常,当您在工作线程中创建或操作数据时,工作线程将向UI线程发送事件以更新UI。工作线程决不应该更新UI本身,它将自动失败。

答案 1 :(得分:0)

实际上费尔南多,这不是一个坏主意,但这不是看待锁定的正确方法。您需要仔细阅读锁定语句在.Net中的作用:

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

我认为从你的语句中你希望锁定整个对象,或者以某种方式使线程安全,因为对象iteself用在一个锁定的代码块中。实际发生的是代码块被锁定,并且不允许两个或多个线程同时执行。如果那段代码是你将要在控件上运行的唯一地方,那么你就可以了,否则你需要对对象本身进行同步锁定。

答案 2 :(得分:0)

没有很多使用线程的经验,但是,也许我建议你使用匿名委托在新线程中启动Form Control:

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

t.Start();

答案 3 :(得分:0)

完全取决于“未改变”的含义。

如果你的意思是“任何其他线程都无法以任何方式改变这种控制”,那么这不是锁的工作方式。

这种意义上的锁不像房子门上的常规锁。它更像是一个小黄色的便条纸,上面写着“锁定”。只要其他线程读取注释并遵守它所说的内容,它应该没问题,但任何其他根本不关心注释的线程当然不会被阻止弄乱你的控件。

无论如何,你到底想要完成什么?你不应该 搞乱主线程以外的控件,所以问题不应该存在。

相反,您应该通过在控件上使用Invoke方法将控件上的所有工作编组到主线程上。