0

有人可以给我一些关于从表单中获取标签文本的正确“线程安全”方式的想法吗?我目前收到一个 CrossThreadingMessaging 异常。我知道我应该使用委托,但我在让它正常工作时遇到问题。有人可以给我一个例子吗?我的主表单中有一个标签,我想从中获取文本。我必须从另一个班级打来电话。这里的任何指导将不胜感激。

这是我的场景:

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

4

1 回答 1

0

可以从线程中调用 Label 的 Text 属性的属性 getter,而无需调用通常会遇到的 IllegalOperationException。这是一个实现细节,Text 属性的值被缓存在一个内部字符串中。例如:

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

没有例外。但是设置 Text 属性肯定会调用锤子。否则,使用这种代码并不是一个好主意。使用线程来执行非 UI 相关的工作,当你启动它们时给它们他们需要的东西。并且喜欢 BackgroundWorker 类,它非常方便地提供线程安全的进度更新和线程安全的结果。

于 2012-08-22T17:02:08.943 回答