如何在C#winform应用程序中的2个独立线程上制作2个表单

时间:2013-01-29 07:37:52

标签: c# winforms multithreading c#-4.0 backgroundworker

我正在我的C#4.0 winform应用程序中开发一个接口,以批量发送一些短信。每个消息内容都不同,因此我必须逐个发送消息。我有一个表格,最终用户可以拍摄smss,它可能超过一千。

我想管理一个队列。如果用户射击短信,那么它将被提交到队列,队列将逐个发送短信。

所以我必须创建一个表单来管理队列。问题是我希望我的应用程序正常工作,并且在后台队列发送短信。

那我怎么能完成这个任务呢?我试过BackGroundWorker,但我不知道如何用表单维护一个单独的线程。

3 个答案:

答案 0 :(得分:2)

所有表单必须位于UI线程上。 SMS的发送应由BackgroundWorker.DoWork事件执行。然后,BackgroundWorker.RunWorkerCompleted事件将更新表单。

UI线程是SWF(winforms)应用程序的主线程

如果您使用的是C#4.0或更高版本,您可能还想调查Take Parallel Library(http://msdn.microsoft.com/en-us/library/dd460717.aspx)。但我首先要让BackgroundWorker实现工作。然后使用TPL同时发送短信。真的可以加快速度。

答案 1 :(得分:1)

你必须创建一个在你的应用程序中运行的线程(称为工作线程)。

你必须有一个队列,甚至更好的并发队列http://msdn.microsoft.com/en-us/library/dd267265.aspx

当一个项目(短信)出现在队列中时,工作线程等待,获取该项目并开始工作。

UI完全脱离了这项工作。

这是Thread类的最基本用法。

后台工作者是最不适合的解决方案。显然你可以用洗衣机盖房子,但大多数人都用砖头。

答案 2 :(得分:0)

您可以启动Thread然后在其上创建新的表单实例(没有父项),然后启动消息循环(此类代码位于项目模板的Main方法中)。 请记住,任何形式(通常是任何GDI对象)只能在创建它的线程上使用。例如,你不能在另一个线程上创建子表单,然后是父表单。每个GUI线程都必须运行消息循环。