我已将.Net 1.1.Net项目从.Net 1.1迁移到.Net 3.5,当我尝试运行它时,我收到以下错误:
跨线程操作无效: 从a访问控制'grpLogin' 线程以外的线程 创建于。
当一个线程(我假设它不是UI线程)将按钮的enabled属性更改为true时。
我认为在框架中发生了一些变化以添加此限制,是否有办法在不对整个应用程序进行检修的情况下完成此工作?
我可以制作VS(我正在使用VS 2008)将该应用程序作为.Net 1.1运行(我甚至不确定这是否是问题)
该应用程序仅仅是一个API的测试应用程序,我被告知要进行逆向工程,因此我并没有真正的带宽来解决所有问题。我知道它之前有用,但是我没有安装旧版本的VS,所以我不得不将它转换为VS 2008。
答案 0 :(得分:1)
修复不是使用匿名方法:只是以某种方式使用Control.Invoke
或Control.BeginInvoke
。无论是匿名方法,从方法组创建的委托还是lambda表达式都无关紧要 - 重点是您需要编组到UI线程。有关详细信息,请参阅my threading article。您可能还需要考虑使用BackgroundWorker来简化操作。 (我的文章是在.NET 2.0之前编写的,因此缺少BackgroundWorker引用。)
顺便说一句,这已经是你的1.1代码中的一个错误 - 这不是.NET 2.0中的新限制,只是.NET 2.0在运行时添加了一个检查(抛出你看过的异常)调试模式。
答案 1 :(得分:0)
Found Fix here解决方案是使用自治代表:
// running on worker thread...
string newText = LongRunningOperation();
//switch to UI thread
this.Invoke((MethodInvoker)delegate {
// this bit runs on the UI thread
this.Text = newText;
});
显然,将“this.Text”替换为您想要在UI线程中运行的任何代码,都可以实现魅力。
仍然对在VS 2008下以.Net 1.1运行的方式感兴趣我听说你可以在其中运行多个F / Work版本,只是不知道如何。
我已经开始将自治代表添加到有UI代码来解决此问题的任何地方。