这是我遇到的一个奇怪的问题。我有一个用c#编写的窗口应用程序来进行测试。它有一个MDI父表单,托管一些子表单。其中一个表单通过创建进程并将脚本输出捕获到文本框来启动测试脚本。另一种形式是打开串口并监视我正在处理的设备的状态(如shell)。如果我将它们一起运行,则脚本的输出似乎仅在测试完成后出现在文本框中。但是,如果我不打开串行端口表单,则会实时捕获脚本的输出。
有谁知道造成这个问题的原因是什么?我注意到串口形式的onDataReceived evenT处理程序有一个[STAThread]标头。这会导致串口线程的优先级高于其他进程吗?
提前致谢。
答案 0 :(得分:1)
UI线程需要STATHREAD。来自MSDN:
表示应用程序的COM线程模型是单线程单元(STA)。
此外,Windows窗体应用程序只有一个UI线程。听起来你可能需要做的就是让响应式UI使用后台工作线程来控制脚本的运行,并让它将更改传回UI线程。
答案 1 :(得分:0)
我不知道[STAThread]
属性会导致线程具有更高优先级的任何情况。
讨论STA和MTA线程之间差异的SO question:
COM线程模型称为 “公寓”模型,在哪里执行 初始化COM对象的上下文是 与单个线程相关联 (单线程公寓)或许多 线程(多线程公寓)。在 这个模型,一个COM对象,一次 在公寓里初始化,是一部分 该公寓的持续时间 它的运行时间。
STA模型用于COM对象 这不是线程安全的。这意味着 他们不处理自己的问题 同步。这个的常见用途 是一个UI组件。所以如果另一个 线程需要与之交互 对象(例如按下按钮) 然后消息被编组 到STA线程。窗户形成 消息抽水系统就是一个例子 这个。
如果COM对象可以自己处理 同步然后MTA模型可以 用于多个线程的地方 允许与对象进行交互 没有编组电话。