我没有问题(还),因为我的应用程序可以工作,但我想了解发生了什么,所以我以后不会遇到麻烦。(我主要是数据库/Web 应用程序程序员,所以线程通常不是我的事!)
简短版:当多个线程更新表单数据时,UI 是否需要锁定表单数据?
我有一个简单的 Winforms 应用程序(使用 DataGridViews),它扫描文件中的某些内容并将结果显示给用户。起初我在 UI 线程中完成了这一切,但了解到这不是一个好主意,并决定将 ThreadPool.QueueUserWorkItem 用于 [ProcessorCount] 项目集合。这很好用,使用委托和 BeginInvoke 功能在找到结果时将结果发送到 UI。(虽然有时结果太多,用户界面仍然滞后,但这是另一个问题。)
工作线程是完全隔离的,做自己的事情。我了解多线程的概念,并且需要注意同时访问共享数据。然而,我不完全清楚的是,当各种线程调用 UI 线程来更新它时会发生什么。只有 UI 会更新控件(和表单级变量),但由于调用来自其他线程,这将如何发挥作用?例如,如果我将项目添加到 List 或增加计数器,来自一个工作线程的调用可以中断另一个工作线程吗?每个 BeginInvoke 都是它自己的调用,但修改数据似乎仍然是一个问题。
我发现的 BeginInvoke 示例都没有提到任何需要锁定 UI。这两个主题是相关的,但仍然没有给出我正在寻找的确切答案: