0

如何使用 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 后,任务将异步分配给文本框。然后它会进行计数并在完成时设置文本,即程序可以进行其他操作,当任务完成时,文本框将在后台更新。我是线程新手,想要一些关于如何进行的指示。

4

2 回答 2

0

将线程分配给控件没有多大意义。所有 UI 都在一个线程上运行,称为“主”或“UI”线程。

多次运行相同的代码并没有多大意义,即使它在多个线程上“同时”发生。在我看来,您只需要计算一次结果并将其显示在多个文本框中。那只需要一个后台线程。

无论哪种方式,都不要使事情过于复杂。使用该BackgroundWorker组件可以让您自己更轻松地将计算任务转移到后台线程。将一个放在您的表单上,为其DoWork事件添加一个处理程序(在其中进行计算),然后为其添加另一个处理程序RunWorkerCompleted(在其中显示计算结果)。

如果您在执行此操作时遇到问题,则在链接文档的底部有一个很好的示例说明如何使它打勾。只需根据您的需要进行修改。

于 2013-07-11T09:03:41.687 回答
0

我认为您想要做的是将以下内容添加到您在线程中运行的代码的末尾:

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 中检查代码。)

于 2013-07-11T19:07:03.690 回答