【问题标题】:delegates after migrating .Net 1.1 project to 3.5将 .Net 1.1 项目迁移到 3.5 后的代表
【发布时间】:2009-02-12 10:17:07
【问题描述】:

我已将 .Net 旧 .Net 项目从 .Net 1.1 迁移到 .Net 3.5,当我尝试运行它时出现以下错误:

跨线程操作无效: 从 a 访问的控件“grpLogin” 线程以外的线程 创建于。

当线程(我假设它不是 UI 线程)将按钮的 enabled 属性更改为 true。

我认为在框架中进行了一些更改以添加此限制,有没有办法在不彻底检查整个应用程序的情况下完成这项工作?

我可以让 VS(我正在使用 VS 2008)将应用程序作为 .Net 1.1 运行(我什至不确定这是不是问题所在)

该应用程序只是一个 API 的测试应用程序,我被告知要对其进行逆向工程,所以我真的没有足够的带宽来解决它的所有问题。我知道它以前可以工作,但我没有安装旧版本的 VS,所以我不得不将其转换为 VS 2008。

【问题讨论】:

    标签: c# .net delegates


    【解决方案1】:

    解决方法不是使用匿名方法:它只是以一些的方式使用Control.InvokeControl.BeginInvoke。它是匿名方法、从方法组创建的委托还是 lambda 表达式都没有关系——关键是您需要编组到 UI 线程。有关详细信息,请参阅my threading article。您可能还想考虑使用BackgroundWorker 使其更容易。 (我的文章是在 .NET 2.0 之前编写的,因此缺少 BackgroundWorker 引用。)

    顺便说一句,这已经是您的 1.1 代码中的一个错误 - 这不是 .NET 2.0 中的新限制,只是 .NET 2.0 在运行时添加了一个检查(抛出您看到的异常)调试模式。

    【讨论】:

      【解决方案2】:

      发现 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;
        });
      

      显然,用你想在 UI 线程中运行的任何代码替换“this.Text”,很有魅力。

      仍然对在 VS 2008 下作为 .Net 1.1 运行的方式感兴趣我听说您可以在其中运行多个 F/Work 版本,只是不知道如何。

      我已经开始将匿名代表添加到任何有 UI 代码来解决此问题的地方。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-05
        • 2011-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-29
        相关资源
        最近更新 更多