【发布时间】:2014-05-22 13:18:08
【问题描述】:
我正在尝试通过在主 UI 线程上调用工作线程来运行代码;但是,我没有主窗体或任何控件的实例(我也不希望在线程代码正在运行的类中有一个)。
我发现了诸如内置 System.Windows.Forms.MethodInvoker 委托之类的东西,它有一个 Invoke() 方法。我想如果我在主线程上实例化我的MethodInvoker,然后在工作线程上调用它的Invoke() 方法,一切都会按我的意愿工作。但是,简单的调试表明被调用的方法仍然在工作线程上运行。
我在MethodInvoker.Invoke() 上找不到任何文档。 MSDN 上甚至没有“会员”链接,但它确实存在。我发现的唯一一件事,即我已经知道的,是这个 SO 帖子中接受的答案:
Using C# MethodInvoker.Invoke() for a GUI app... is this good?
所以,我的问题是:
如何在没有主窗体实例或其他 UI 元素的情况下调用主线程上的方法?
为什么没有在任何地方记录
MethodInvoker.Invoke()方法?我错过了什么?
【问题讨论】:
-
您可以将invoke方法传递给在启动期间运行线程的代码,以便您可以调用它。通常,当我从后台线程获得 UI 需要的信息时,我会发送 UI 的某些部分正在侦听的通知事件,然后让事件处理程序调用调用。如果这对您的代码不可行,您能解释一下吗?
-
MethodInvoker 是一个委托,这意味着它定义了一个函数签名,但没有行为。它是传递给类的 Invoke 方法的内容(在本例中为您的 UI 表单)
-
@SteveMitcham -- 谢谢。我有一个带有计时器的类,它负责在计时器经过时更新多个 UI 元素。此类实际上并不包含对这些 UI 元素的引用;相反,它包含对他们“代码背后”的引用(我将表示与逻辑分开)。我不想存储任何 UI 元素,也不想让我的计时器类对 UI 有任何了解。
-
@SteveMitcham -- 我喜欢你关于在 UI 中使用事件处理程序的建议。
标签: .net multithreading delegates invoke ui-thread