我正在我的 C# 4.0 winform 应用程序中开发一个接口,以批量发送一些短信。每条消息内容都不一样,所以我必须一条一条地触发消息。我有一个最终用户可以发送短信的表格,它可能超过一千个。
我想管理一个队列。如果用户发送一条短信,那么它将被提交到队列中,队列将一一发送短信。
所以我必须创建一个表单来管理队列。问题是我希望我的应用程序正常工作,并且队列在后台发送短信。
那么我怎样才能完成这个任务呢?我试过BackGroundWorker
了,但我不知道如何用表单维护一个单独的线程。
我正在我的 C# 4.0 winform 应用程序中开发一个接口,以批量发送一些短信。每条消息内容都不一样,所以我必须一条一条地触发消息。我有一个最终用户可以发送短信的表格,它可能超过一千个。
我想管理一个队列。如果用户发送一条短信,那么它将被提交到队列中,队列将一一发送短信。
所以我必须创建一个表单来管理队列。问题是我希望我的应用程序正常工作,并且队列在后台发送短信。
那么我怎样才能完成这个任务呢?我试过BackGroundWorker
了,但我不知道如何用表单维护一个单独的线程。
所有表单都必须在 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 发送同步短信。真的可以加快速度。
您必须创建一个线程(称为工作线程),它会在您的应用程序的整个生命周期中运行。
你必须有一个队列甚至更好的并发队列http://msdn.microsoft.com/en-us/library/dd267265.aspx
当队列中出现一个项目(短信)时,工作线程等待,获取该项目并完成其工作。
UI 与该工作完全分离。
这是 Thread 类的最基本用法。
后台工作者是最不适合的解决方案。显然你可以用洗衣机盖房子,但大多数人用砖头。
您可以启动 Thread 然后在其上创建新的表单实例(没有父级),然后启动消息循环(此类代码位于项目模板的 Main 方法中)。请记住,任何形式(通常是任何 GDI 对象)都只能在创建它的线程上使用。例如,您不能在另一个线程上创建子窗体,然后是父线程。每个 GUI 线程都必须运行消息循环。