2

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

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

4

5 回答 5

3

Task使用 .NET 4.0 的类要简单得多:

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();
}
于 2012-12-22T22:37:35.520 回答
0

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

于 2012-12-22T22:38:16.010 回答
0

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

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

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

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

于 2012-12-22T22:38:44.110 回答
0

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

于 2012-12-22T22:39:16.563 回答
0

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

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

下次问之前先搜索一下。

于 2012-12-22T22:39:38.460 回答