c# - 对在单独线程上添加控件后的 WinForm 控件线程安全感到好奇

标签 c# winforms thread-safety

我设置了一个 FileSystemWatcher 来拾取将被放入特定目录中的图片。我处理它的方法是在停靠在面板内部的代码中添加一个 PictureBox。我运行它,它爆炸了,我意识到我没有正确处理与主线程上的控件的交互。这是代码:

        PictureBox pb = new PictureBox();
        pnlCapturePicture.Controls.Add(pb);
        pb.Dock = DockStyle.Fill;
        pb.ImageLocation = photopath;

现在我了解了如何对 Windows 窗体控件进行[线程安全调用][1],但我很好奇,如果我只是使面板添加线程安全,我真的能完成任何事情吗?

假设我这样做了:

        PictureBox pb = new PictureBox();
        AddControlThreadSafe(pb);
        pb.Dock = DockStyle.Fill;
        pb.ImageLocation = photopath;

将 PictureBox 控件添加到面板后与其进行交互真的是线程安全的吗?

最佳答案

不,这不会起作用。 所有 GUI 代码都必须在适当的用户界面线程上完成。线程上下文不会一直被检查,因此可以编写类似现在可以工作但在将来的 .NET 框架更新时失败的代码。

在您的情况下,FileSystemWatcher 理解 ISynchronizeInvoke 模式,因此只需将其 SynchronizingObject 属性设置为它所使用的表单即可。请注意,如果您使用设计器将 FileSystemWatcher 放置在表单上,​​则会自动设置此属性。

关于c# - 对在单独线程上添加控件后的 WinForm 控件线程安全感到好奇,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3240149/

相关文章:

c# - 模型属性作为空值传递给操作

c# - 为什么一个对象在带有 var 的 foreach 中不是强类型的?

c# - 防止文本框覆盖以前的数据

c# - 如何在 Linux 或 Mac OS 上运行 Windows 服务

java - 使 SimpleDateFormat 线程安全

c# - 如果填充文本框则启用按钮

c# - 在调用 RunWorkerAsync 之后但在函数退出之前取消订阅 DoWork 是否安全?

c# - short.Parse 是属性还是方法?

c++ - 重载运算符的线程安全新

java - 这段代码不是线程安全的——有必要吗?