我正在寻找答案很长一段时间,但是我还没有找到答案如何在线程/主线程和运行时创建的线程之间进行通信。我在Java中遇到了这个问题,现在又回到了C#。
假设我想编写C#应用程序,它具有简单文本标签的形式,我想运行增加该标签中写入的数值的线程。我正在使用表单和线程类创建主类。然后我在我的主类中创建线程类的新对象并在其上启动线程。
如何更改main中定义的标签文本?
答案 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();