【问题标题】:Run a form in another thread在另一个线程中运行表单
【发布时间】:2010-06-17 02:14:44
【问题描述】:

我的 c# 项目中有五个表单。一个主机一个我想连续运行的httplistener。当侦听器收到一条消息时,它会将消息传递给一个静态类,该类又调用适当的表单进行另一次处理。

静态类是否有可能在新线程中调用新表单?如果是的话请帮帮我

【问题讨论】:

  • 什么样的表格? Windows 窗体?网络表格? WPF 表单?税表?
  • 只在主窗体线程上使用控件——这适用于 WinForms 和 WPF(实际上还有 Swing);根据需要编组到正确的线程(请参阅答案)。随意访问通常会导致“跨线程”异常和其他“坏事”。
  • 正在使用vs2005,正在调用winforms。

标签: c# forms multithreading


【解决方案1】:

表单中的代码应该只处理表单的视觉方面。其他任何事情,尤其是 http 侦听器,都应该使用在后台线程上运行的单独类来处理。

【讨论】:

  • @Smith:你问的是运行后台线程,还是你的 http 监听器?
  • 这就是我想要做的“应该用在后台线程上运行的单独的类来处理。”
【解决方案2】:

“调用表单”没有任何意义,我猜你只想 Show() 它。在工作线程上创建表单从不是个好主意。即使您确实获得了正确的线程状态(STA 和消息循环),您也会遇到难以解决的 Z 顺序和模态问题。

只需使用 Control.Invoke 在 UI 线程上运行代码。它应该创建表单并调用它的 Show() 方法。

【讨论】:

  • 补充说明:还有 SychronizationContext 和朋友,有时很有用。
【解决方案3】:

正如汉斯所说,可能不推荐,但如有必要,您可以从任何线程调用System.Windows.Forms.Application.Run()。如果你这样做,请小心并知道你在做什么。

【讨论】:

    猜你喜欢
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 2021-10-12
    • 2016-12-15
    相关资源
    最近更新 更多