如何将多个线程分配给windows窗体上的类似控件
本文关键字:窗体 控件 windows 分配 线程 | 更新日期: 2023-09-27 18:21:52
如何使用C#.Net 3.5为windows窗体上的多个控件分配不同的线程?我想说3个文本框,每个都连接到运行相同的线程函数,比如计算数组中奇数的数量。
理想情况下,使用情况如下:
//count the number of odd numbers in an array and when
//done set the textbox to the value
void AssignTaskToTexbox( TextBox textbox, int[] array);
可以在分配给TextBox的线程中运行的代码将具有如下签名:
int GetCount(int[] array);
//usage:
AsssignTaskToTexbox( textbox1, array1);
AsssignTaskToTexbox( textbox2, array2);
每次调用AssignTaskToTextBox后,任务将异步分配给文本框。然后,它将继续进行计数,并在完成时设置文本,即程序可以继续的来做其他事情,当任务完成时,文本框将在后台更新。我是线程的新手,我想了解一些关于如何继续的提示。
将线程分配给控件没有多大意义。所有UI都运行在一个线程上,称为"主"或"UI"线程。
多次运行同一代码没有多大意义,即使它"同时"发生在多个线程上。在我看来,你只需要计算一次结果,并将其显示在多个文本框中。这只需要一个后台线程。
不管怎样,都不要把事情搞得过于复杂。使用BackgroundWorker
组件可以更轻松地将计算任务转移到后台线程。在表单上删除一个,为其DoWork
事件添加一个处理程序(在其中执行计算),然后为其RunWorkerCompleted
添加另一个处理程(在其中显示计算结果)。
如果你在遵循这一点时遇到困难,那么在链接文档的底部有一个很好的例子来说明如何使其勾选。只需根据您的需要进行修改即可。
我认为您想要做的是在线程中运行的代码末尾添加以下内容:
string v = // a value that took a long time to calculate
Application.Current.Dispatcher.BeginInvoke( () => { textbox.Value = v; }, null );
其想法是在一个独立的线程上运行计算,然后使用UI线程将结果放入TextBox中。
(小心。我正在从Java翻译成C#,这不是我熟悉的C#领域。这个想法很好。但我真的不知道类和方法,我猜是lambda语法,而且我没有在IDE中检查代码。)