线程的通信

本文关键字:通信 线程 | 更新日期: 2023-09-27 17:49:23

我有一个带有文本框和按钮的表单。点击按钮,我正在创建一个线程并调用它进行一些操作。一旦线程完成了被调用的任务,我想用结果更新文本框。

请帮助我如何才能实现这一点没有线程冲突。

线程的通信

使用。net 4.0的Task类要简单得多:

private void button_Click(object sender, EventArgs e)
{
    Task.Factory.StartNew( () => 
    {
         return DoSomeOperation();
    }).ContinueWith(t =>
    {
         var result = t.Result;
         this.textBox.Text = result.ToString(); // Set your text box
    }, TaskScheduler.FromCurrentSynchronizationContext());
}

如果你使用的是。net 4.5,你可以使用新的异步支持进一步简化:

private async void button_Click(object sender, EventArgs e)
{
    var result = await Task.Run( () => 
    {
         // This runs on a ThreadPool thread 
         return DoSomeOperation();
    });
    this.textBox.Text = result.ToString();
}

您需要使用Control.Invoke在它自己的线程中操作您的表单

简单地说,在线程操作结束时:

/// ... your code here
string newText = ...
textBox.Invoke((MethodInvoker) delegate {
    textBox.Text = newText;
});

Control.Invoke使用消息队列将手工工作交给UI线程,因此是UI线程执行textBox.Text = newText;行。

使用BackgroundWorker,将任务分配给DoWork事件,并使用RunWorkerCompleted事件更新文本框。然后,您可以使用RunWorkerAsync()启动任务。

您可以使用下面显示的解决方案:

如何从c#中的另一个线程更新GUI ?

下次问之前先搜索一下