我设置了一个 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/