从Thread更改主类属性

时间:2015-08-07 18:51:04

标签: c# multithreading

我正在寻找答案很长一段时间,但是我还没有找到答案如何在线程/主线程和运行时创建的线程之间进行通信。我在Java中遇到了这个问题,现在又回到了C#。

假设我想编写C#应用程序,它具有简单文本标签的形式,我想运行增加该标签中写入的数值的线程。我正在使用表单和线程类创建主类。然后我在我的主类中创建线程类的新对象并在其上启动线程。

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

1 个答案:

答案 0 :(得分:0)

因此,如果我理解正确,您就会询问如何从其他线程更改GUI。

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

您必须熟悉的另一个概念是任务。 Task是一个抽象,在功能上与线程相同。两个任务可以同时运行。 Task.Run启动一个新的Task,其工作量由一个函数表示。

话虽如此,这是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线程上),我仍然可以在Button上执行代码通过发布到窗口SynchroniztaionContext

修改:如果您对“任务”感到不满意,并且您想要使用Thread,那么您也可以这样做:

var context = SynchronizationContext.Current;

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

thread.Start();