C#在Windows窗体应用程序中获取标签文本的线程安全方式

C#在Windows窗体应用程序中获取标签文本的线程安全方式,c#,multithreading,delegates,C#,Multithreading,Delegates,有人能给我一些关于从表单中获取标签文本的正确“线程安全”方法的想法吗?我当前收到一个CrossThreadingMessaging异常。我知道我应该使用一个代理,但我在如何使其正确工作方面遇到了问题。有人能给我举个例子吗?我有一个主表单中的标签,我想从中获取文本。我必须从另一个班级打电话。在此提供任何指导都将不胜感激 抢劫 以下是我的设想: 我必须创建一个应用程序,从USB秤上抓取重量,并通过DDE调用将这种等待传递回遗留系统。遗留系统通过模拟器程序对我的可执行文件进行DDE调用,以获得权重。我

有人能给我一些关于从表单中获取标签文本的正确“线程安全”方法的想法吗?我当前收到一个CrossThreadingMessaging异常。我知道我应该使用一个代理,但我在如何使其正确工作方面遇到了问题。有人能给我举个例子吗?我有一个主表单中的标签,我想从中获取文本。我必须从另一个班级打电话。在此提供任何指导都将不胜感激

抢劫

以下是我的设想:


我必须创建一个应用程序,从USB秤上抓取重量,并通过DDE调用将这种等待传递回遗留系统。遗留系统通过模拟器程序对我的可执行文件进行DDE调用,以获得权重。我试图在C#应用程序中模拟旧的VB5应用程序。相信我,我还有很多其他的方法可以做到这一点,但管理层告诉我要这样做。我已经在标签文本中捕获了权重,但是现在我必须从主窗体上的标签中获取权重,并在执行DDE OnRequest方法时返回它。这就是我得到交叉线程异常的地方。OnRequest当然位于主窗体类之外的类中。

可以通过线程调用标签文本属性的属性getter,而无需调用通常获得的非法操作异常。这是一个实现细节,Text属性的值缓存在一个内部字符串中。例如:

    private void button1_Click(object sender, EventArgs e) {
        var t = new Thread(() => Console.WriteLine(label1.Text));
        t.Start();
    }

也不例外。但是设置Text属性肯定会调用hammer。否则,使用这种代码并不是一个好主意。使用线程执行与UI无关的工作,在启动线程时为其提供所需的内容。喜欢BackgroundWorker类,它非常方便地提供线程安全的进度更新和线程安全的结果。

给你:@code4life这是用于windows窗体的…另外,我使用的是.NET 4.0 Framework…Justin指出了正确的答案。感谢你提供的信息。请看一看我更新的场景,任何评论或建议都会很好。