DLL中的DoEvents

时间:2008-11-11 18:14:56

标签: c# dll

您是否有任何想法如何从C#DLL调用DoEvents

4 个答案:

答案 0 :(得分:15)

别。当你是控制事件循环的应用程序时,它足够粗略;从DLL中提取消息只会增加你最终会遇到代码的风险,因为一个天真的程序员并没有为重新安排做出安全保障。

答案 1 :(得分:3)

您的意思是System.Windows.Forms.Application.DoEvents()吗?

答案 2 :(得分:2)

我回应“不要”(来自dll或UI项目)。您可以通过以下几种方法使库代码与UI完美匹配,包括可以从UI使用的相同线程技巧(包含事件和/或回调)。最简单的方法是使库代码简单地“按原样”执行,如果UI恰好在工作线程上生成它,那么UI的工作就是处理任何事件并将它们编组(Control.Invoke/BeginInvoke)用于UI更新的UI线程。

对于更复杂的场景,您可以使用sync-context(SynchronizationContext.Current)将消息发布到UI线程(这实际上是Control.Invoke等的工作方式,但它是独立于实现的 - 所以a WPF同步上下文可以通过WPF调度程序。)

您可以在场景中添加更多上下文吗?有很多事情可以做......

答案 3 :(得分:0)

为EXE编写一个接口,让主窗体或主类实现它。 然后注册实现DLL接口的对象。 将其分配给该接口类型的变量 创建一个在整个DLL中可见的子例程。 在子例程中检查变量是否为空,如果不是,则触发您创建的方法以触发DoEvents的子例程。 任何时候你需要做一个DoEvents然后调用子程序。

如果您为应用程序使用三层组织,则将子例程或变量放在代表整个应用程序的对象上。让表单自己注册Application对象。

如果您有重入问题,可以添加状态变量和其他帮助函数,以安全地检查应用程序正在执行的操作。请注意,如果您使用某种类型的多层设计,则更容易实现此目的。

对于其他看这个重新入门的问题是一个问题,但是无响应的UI也是如此。在复杂的应用程序中,有些情况下你必须让事件循环触发。