更改Thread中的主要类属性

本文关键字:属性 Thread 更改 | 更新日期: 2023-09-27 18:06:50

我一直在寻找答案,但我还没有找到线程/主线程和运行时创建的线程之间的通信应该是什么样子的答案。我在Java中遇到过这个问题,现在它又出现在C#中了。

比方说,我想写一个C#应用程序,它有一个带有简单文本Label的表单,我想运行一个线程来增加写在该标签中的数值。我正在用表单和线程的类创建主类。然后我在我的主类中创建线程类的新对象,并在它上启动线程

如何更改在main中定义的标签的文本?

更改Thread中的主要类属性

因此,如果我理解正确,您将询问如何从另一个线程更改GUI。

这是通过一个名为SynchronizationContext的构造完成的,它本质上提供了在另一个线程上运行代码的方法。因此,在您的情况下,如果您想更改GUI线程中定义的标签的文本,您可以获取与GUI线程对应的SynchronizationContext,并通过其他线程向其发布代码。

另一个你必须熟悉的概念是任务。Task是一种抽象,在功能上与线程相同。两个任务可以同时运行。CCD_ 3启动一个新的CCD_。

话虽如此,下面是WPF中的一个例子:

public class MainWindow
{
    public MainWindow()
    {
        InitializeComponent();
    }
    private void Button_Click(object sender, RoutedEventArgs e)
    {
        var context = SynchronizationContext.Current;
        Task.Run(() => context.Post(state => Button.Content = "Hello World!"));
    }
}

注意,即使我在Task.Run中(这意味着我不在GUI线程上(,我仍然可以通过发布到窗口的SynchroniztaionContext来在Button上执行代码。


编辑:如果您对Task还不满意,并且希望使用Thread,您也可以这样做:

var context = SynchronizationContext.Current;
var thread = new Thread(() => context.Post(state => Button.Content = "Hello World!"));
thread.Start();