线程沟通

时间:2012-12-22 22:35:10

标签: c# multithreading

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

任何人请帮助我如何在没有线程冲突的情况下实现这一点。

5 个答案:

答案 0 :(得分:3)

使用.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();
}

答案 1 :(得分:0)

您需要使用Control.Invoke在自己的主题中操作表单。

答案 2 :(得分:0)

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

/// ... your code here
string newText = ...

textBox.Invoke((MethodInvoker) delegate {
    textBox.Text = newText;
});

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

您可以使用此处显示的解决方案:

How to update the GUI from another thread in C#?

下次在询问之前搜索一下。