如何在C#winform应用程序中在两个单独的线程上生成两个窗体

如何在C#winform应用程序中在两个单独的线程上生成两个窗体,c#,winforms,multithreading,c#-4.0,backgroundworker,C#,Winforms,Multithreading,C# 4.0,Backgroundworker,我正在我的C#4.0 winform应用程序中开发一个接口,以批量发送一些sms。每封邮件的内容都不一样,所以我必须一封接一封地发送邮件。我有一个表单,最终用户可以从中拍摄SMS,它可能超过1000个 我想管理一个队列。如果用户发送短信,那么它将被提交到队列,队列将逐个发送短信 因此,我必须创建一个表单来管理队列。问题是我希望我的应用程序正常工作,并且在后台队列发送sms 那么我如何才能完成这项任务呢?我已经尝试了BackGroundWorker,但我不知道如何用表单维护一个单独的线程。所有表单

我正在我的C#4.0 winform应用程序中开发一个接口,以批量发送一些sms。每封邮件的内容都不一样,所以我必须一封接一封地发送邮件。我有一个表单,最终用户可以从中拍摄SMS,它可能超过1000个

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

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


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

所有表单都必须在UI线程上。SMS的发送应由
BackgroundWorker.DoWork
事件执行。然后通过
BackgroundWorker.RunWorkerCompleted
事件更新表单

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


如果您使用的是C#4.0或更高版本,您可能还需要研究Take并行库()。但我会首先让BackgroundWorker实现工作。然后使用TPL发送同步短信。确实可以加快速度。

所有表单都必须在UI线程上。SMS的发送应由
BackgroundWorker.DoWork
事件执行。然后通过
BackgroundWorker.RunWorkerCompleted
事件更新表单

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


如果您使用的是C#4.0或更高版本,您可能还需要研究Take并行库()。但我会首先让BackgroundWorker实现工作。然后使用TPL发送同步短信。确实可以加快速度。

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

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

您必须创建一个线程(称为工作线程),该线程在应用程序的生命周期内运行

您必须有一个队列,或者更好的是一个并发队列

当项目(sms)出现在队列中时,工作线程将等待该项目并执行其工作

UI与该工作完全解耦

这是类Thread的最基本用法


背景工作者是最不合适的解决方案。显然,您可以使用洗衣机来建造房屋,但大多数人使用砖块。

您必须创建一个线程(称为worker线程),该线程在应用程序的生命周期内运行

您必须有一个队列,或者更好的是一个并发队列

当项目(sms)出现在队列中时,工作线程将等待该项目并执行其工作

UI与该工作完全解耦

这是类Thread的最基本用法


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

UI线程是主线程吗?请简要描述您的回答。据我所知,所有表单必须在同一线程上创建,这本身没有任何限制。但是,与表单的任何交互都必须在创建表单的同一线程上执行。我还没有广泛地这样做,所以可能有一些我不知道的陷阱。我在第二个表单/队列表单上有一个DataGridView,当我在后台工作程序中使用该DataGridView时,我得到了跨线程引用的错误消息。如何克服这一点。@FredrikMörk,我相信Windows消息泵不会在非UI线程上传递到表单。理查德施耐德:几年前,我做了一些小调查,结果写了一篇博文(),看起来效果不错。尽管如此,在一个单独的线程上创建表单将是解决实际问题的一种方法,这似乎是一种非常罕见的情况。你在这里的解决方案更好;它还旨在将工作与演示分离。UI线程是主线程吗?请简要描述您的回答。据我所知,所有表单必须在同一线程上创建,这本身没有任何限制。但是,与表单的任何交互都必须在创建表单的同一线程上执行。我还没有广泛地这样做,所以可能有一些我不知道的陷阱。我在第二个表单/队列表单上有一个DataGridView,当我在后台工作程序中使用该DataGridView时,我得到了跨线程引用的错误消息。如何克服这一点。@FredrikMörk,我相信Windows消息泵不会在非UI线程上传递到表单。理查德施耐德:几年前,我做了一些小调查,结果写了一篇博文(),看起来效果不错。尽管如此,在一个单独的线程上创建表单将是解决实际问题的一种方法,这似乎是一种非常罕见的情况。你在这里的解决方案更好;它还旨在将工作与演示分离。拥有多个UI线程是一个非常糟糕的主意,只有在绝对必要的情况下才应该这样做。这里不需要。拥有多个UI线程是一个非常糟糕的主意,只有在绝对必要的情况下才应该这样做。这里不需要它。在大多数情况下,
BlockingCollection
优于
ConcurrentQueue
(它将