0

我目前被分配了一个几年前用 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; 
4

2 回答 2

1

如果您的项目在其多线程代码中包含错误,使用新的框架和线程处理从奇怪的故障发展到实际异常(这是一件好事),您无能为力,只能一个接一个地解决这些错误。用一颗灵丹妙药修复所有有缺陷的代码并没有什么魔法。

于 2013-09-12T07:26:07.470 回答
1

因此,如果您切换了框架,我认为您也切换了 Visual Studio 版本?

在 VS 中,您可以配置如果您想查看,Cross-Thread exception并且我认为在您的旧版本中,这个提示只是被关闭了。所以你所有的问题已经存在于你的旧代码中,但现在你又看到了。

如果您尝试从 gui 控件设置(有时甚至获取)某些信息,您必须确保您在 gui 线程中执行此操作,而不是从任何其他线程中执行此操作。问题是它可以工作,但不能保证(可能只会在客户机器上崩溃)。

因此,请将这些异常视为您工具中的一个真正问题,必须尽快修复。

您可以进入您的 gui 线程并调用WindowsFormsSynchronizationContext.Current;并将接收到的对象传递给您的其他线程,以便它们可以调用Post()Send()在它们上,或者如果您可以直接访问您只需调用control.Invoke()control.BeginInvoke()在其上的控件。

也许你也应该看看这个SO question

于 2013-09-12T08:46:00.907 回答