将.Net 1.1项目迁移到3.5之后的代表

时间:2009-02-12 10:17:08

标签: c# .net delegates

我已将.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。

2 个答案:

答案 0 :(得分:1)

修复不是使用匿名方法:只是以某种方式使用Control.InvokeControl.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代码来解决此问题的任何地方。