C# 中的线程安全
本文关键字:安全 线程 | 更新日期: 2023-09-27 18:30:58
我目前被分配了一个几年前在 C# 中实现的项目。它由框架和一些 excel 文件提取组成,但问题是这个项目非常破碎/过时,我必须更改一些功能并添加一些新功能。
有一些库仅在 .NET Framework 3.0 之后才受支持,我需要在新功能中使用,并且当前项目构建的框架是 2.0 或更低版本,因此更改框架引发了一些线程安全问题。
例如,在设计文件代码和尝试更改一个标签值的后端代码的两个部分类之间,会引发一个错误,指出我无法编辑当前正在使用的内容......我为其中一个标签使用了代表,它工作正常。然后另一个文本框引发了另一个错误。那么有没有一个选项可以封装整个事情并将线程安全应用于整个代码,而不必遵循发生错误的每一行?
从评论编辑
例外情况:
Exception while Saving Links. Exception: System.InvalidOperationException: Cross-thread operation not valid: Control 'picLinkUBKCross' accessed from a thread other than the thread it was created on.
编码谁接缝失败
this.picLinkUBKCross.Image = ((System.Drawing.Image) resources.GetObject("picLinkUBKCross.Image")));
this.picLinkUBKCross.Location = new System.Drawing.Point(367, 57);
this.picLinkUBKCross.Name = "picLinkUBKCross";
this.picLinkUBKCross.Size = new System.Drawing.Size(56, 35);
this.picLinkUBKCross.SizeMode = System.Windows.Forms.PictureBoxSizeMode.StretchImage;
this.picLinkUBKCross.TabIndex = 14;
this.picLinkUBKCross.TabStop = false;
如果您的项目在多段代码中包含错误,随着新的框架和线程处理从奇怪的故障发展到实际的异常(这是一件好事),除了一个接一个地解决这些错误之外,您无能为力。没有魔法可以用一颗银弹修复所有错误代码。
所以如果你已经切换了框架,我想你也切换了你的Visual Studio版本?
在VS中,您可以配置是否要查看Cross-Thread exception
,我认为在您的旧版本中,此提示只是关闭了。所以你所有的问题都已经存在于你的旧代码中,但现在你又看到了它。
如果您尝试从 gui 控件设置(有时甚至获取)某些信息,则必须确保在 gui 线程中执行此操作,而不是从任何其他线程执行此操作。问题是它可以工作,但无法确保(可能只会在客户机器上崩溃)。
因此,请将这些异常视为工具中的实际问题,必须尽快修复。
要么进入 gui 线程并调用 WindowsFormsSynchronizationContext.Current;
并将接收的对象传递给其他线程,以便它们可以调用Post()
或Send()
,或者如果您可以直接访问控件,您只需调用control.Invoke()
或control.BeginInvoke()
即可。
也许你也应该看看这个SO问题。