线程的通信
本文关键字:通信 线程 | 更新日期: 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 ?
下次问之前先搜索一下