【问题标题】:How to make 2 forms on 2 separate threads in C# winform application如何在 C# winform 应用程序中的 2 个单独线程上制作 2 个表单
【发布时间】:2013-01-12 17:27:01
【问题描述】:

我正在我的 C# 4.0 winform 应用程序中开发一个接口,以批量发送一些短信。每条消息内容都不一样,所以我必须一条一条地触发消息。我有一个最终用户可以发送短信的表单,它可能超过一千个。

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

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

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

【问题讨论】:

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


    【解决方案1】:

    您必须创建一个线程(称为工作线程),它会在您的应用程序的整个生命周期中运行。

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

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

    UI 与这项工作完全分离。

    这是 Thread 类的最基本用法。

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

    【讨论】:

    • 在大多数情况下,BlockingCollectionConcurrentQueue 更可取(但默认情况下它会包装一个。另外,我看不出使用 BackgroundWorker 是不合适的。这是一个非常合适的在非 UI 线程中执行长时间运行的任务,同时在 UI 线程中管理进度/完成的方法。
    • 对不起。这个多线程琐事。我不知道伙计。读里希特什么的。线程与线程池.. 或询问 Frederik 和 Richard - 他们喜欢讨论事情。
    【解决方案2】:

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

    【讨论】:

    • 拥有多个 UI 线程是一个非常的坏主意,只有在绝对必要时才应该这样做。这里不需要。
    【解决方案3】:

    所有表单都必须在 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 发送同步短信。真的可以加快速度。

    【讨论】:

    • UI 线程是主线程吗?请简要描述你的答案
    • 据我所知,所有表单都必须在同一个线程上创建本身并没有限制。但是,与表单的任何交互都必须在创建表单的同一线程上执行。不过,我还没有广泛地这样做,所以可能有一些我不知道的陷阱。
    • 我在第二个表单/队列表单上有一个 DataGridView,当我在后台工作人员中使用该 datagridview 时,我收到了跨线程引用的错误消息。如何克服这一点。
    • @FredrikMörk,我相信 Windows 消息泵不会传递到非 UI 线程上的表单。我也没有深入研究过。
    • @RichardSchneider:几年前我做了一些小调查,结果发表了一篇博文(A generic approach to a thread safe splash form),它似乎工作正常。尽管如此,在单独的线程上创建表单将是解决实际问题的方法,这似乎是一个非常不寻常的情况。您的解决方案更好;它还旨在将工作与演示分开。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    • 1970-01-01
    • 2019-06-30
    • 2019-04-17
    • 2017-05-21
    • 1970-01-01
    相关资源
    最近更新 更多