我有一个带有文本框和按钮的表单。单击按钮时,我正在创建一个线程并为某些操作调用它。一旦线程完成调用的任务,我想用结果更新文本框。
任何人请帮助我如何在没有线程冲突的情况下实现这一目标。
我有一个带有文本框和按钮的表单。单击按钮时,我正在创建一个线程并为某些操作调用它。一旦线程完成调用的任务,我想用结果更新文本框。
任何人请帮助我如何在没有线程冲突的情况下实现这一目标。
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();
}
您需要使用Control.Invoke
它自己的线程来操作您的表单。
简单地说,在线程操作结束时:
/// ... your code here
string newText = ...
textBox.Invoke((MethodInvoker) delegate {
textBox.Text = newText;
});
该Control.Invoke
用法使用消息队列将工作交给 UI 线程,因此执行该textBox.Text = newText;
行的是 UI 线程。
使用 a BackgroundWorker
,将任务分配给DoWork
事件,并使用事件更新文本框RunWorkerCompleted
。然后您可以使用 启动任务RunWorkerAsync()
。