我有一个带有文本框和按钮的表单。点击按钮我创建一个线程并调用它进行某些操作。一旦线程完成调用的任务,我想用结果更新文本框。
任何人请帮助我如何在没有线程冲突的情况下实现这一点。
答案 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)