【问题标题】:Updating Winform ListView control by one event handler that may be fired from several threads通过一个可能从多个线程触发的事件处理程序更新 Winform ListView 控件
【发布时间】:2014-04-21 12:17:51
【问题描述】:

我有一个“Win Form”应用程序,它监听可能从一些不同线程引发的事件。

关于那个事件,我想更新一个“列表视图”控件。 当然我可能需要使用 Invoke 但我的问题是: 我是否应该在将要构建的功能上使用锁定来更新“列表视图”控件?

请注意,我仅通过表单中的一个函数和一个事件更新列表视图,但多个线程可能会引发相同的事件。

是不是所有线程可能触发的所有事件都只由主线程处理,所以它们会被一一执行?

谢谢。

【问题讨论】:

    标签: c# multithreading winforms listview thread-safety


    【解决方案1】:

    如果您认为该事件可以从多个线程同时触发,或者至少在完成更新之前再次触发,那么是的,您应该锁定。

    简单的:

    lock(myListView) {
      updateMyListView();
    }
    

    应该够了。锁定列表视图对象仍应允许您对其进行编辑。

    提醒一句,这不会阻止其他东西编辑列表视图,只有拥有自己的 lock(myListView) 块的代码会注意锁定。

    【讨论】:

    • 但不是所有线程可能触发的所有事件都只由主线程处理,因此它们将被一一执行吗?
    • 其实那是真的,我忘记了。特别是如果您在必要时调用它应该最终在主线程上。考虑到这一点,使用 lock 语句可能并不重要,但它也不应该花费任何成本(因为它永远不必等待任何解锁)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多