【问题标题】:Lock a winforms control锁定一个winforms控件
【发布时间】:2009-08-10 02:01:51
【问题描述】:

我需要确保,一旦执行到一个方法,这个方法接收到的控制不会被另一个线程改变。 基本上,我是这样想的:

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

这是个坏主意吗?

编辑:

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

【问题讨论】:

    标签: c# winforms controls thread-safety locking


    【解决方案1】:

    在一个表现良好的应用程序中,Windows 窗体控件已经被限制在一个线程中。如果任何线程试图访问在不同线程中创建的控件,则会引发异常。

    您的代码没有任何问题,只需知道现在它大部分无用,除非您通过保护破解自己的方式(这是可能的)。

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

    【讨论】:

      【解决方案2】:

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

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

      我认为从您的陈述中您希望整个对象被锁定,或者以某种方式使线程安全,因为对象本身用于锁定的代码块。实际发生的是代码块被锁定,不允许两个或多个线程同时执行。如果该代码块是您要在控件上操作的唯一位置,那么您就可以了,否则您需要对对象本身进行同步锁定。

      【讨论】:

        【解决方案3】:

        没有太多使用线程的经验,但是,也许我会建议您使用匿名委托在新线程中启动表单控件:

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

        【讨论】:

          【解决方案4】:

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

          如果您的意思是“任何其他线程根本无法以任何方式更改此控件”,那么锁不是这样工作的。

          从这个意义上说,锁与普通的房门锁不同。它更像是一张黄色的小便利贴,上面写着“已锁定”。只要其他线程阅读该注释并遵守它的内容,就可以了,但是任何其他根本不关心该注释的线程当然不会被阻止弄乱您的控件。

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-01-20
            • 1970-01-01
            • 1970-01-01
            • 2018-06-03
            相关资源
            最近更新 更多