问题标签 [doevents]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
11 回答
20638 浏览

vb.net - 如何延迟 vb.net 程序直到文件操作完成?

我有这个:

问题是当我调用 OpenFile 时,它​​只是调用打开文件的子程序,它找不到文件。这是因为它调用它的速度非常快,以至于程序在打开之前没有时间实际创建文件。

我认为 DoEvents() 会纠正这个问题,但事实并非如此。在打开文件之前,我需要等到文件创建完成。我怎样才能做到这一点?

0 投票
4 回答
2541 浏览

c# - 你能从 Application.DoEvents() 中捕获异常吗?

我在 VS2005 中运行的程序和直接运行可执行文件之间遇到了一个奇怪的区别。本质上,当在调用内部的方法中引发Application.DoEvents()异常时,可以在 Visual Studio 中运行时捕获该异常。运行编译后的可执行文件时,不会捕获异常并且程序崩溃。

这里有一些简单的代码来演示这个问题。假设标准的 winforms 样板和两个按钮和一个标签。

要运行此程序,请单击开始按钮以开始 10 秒计数。在 10 秒之前,按中止按钮。并且将在DoEvents(). 应该捕获异常。这只发生在在 Visual Studio 中运行时。

我希望能够捕获这些异常。有什么办法让它工作吗?

更新:

我愿意考虑 re-entrant-headache-inducing 以外的其他方法DoEvents()。但我还没有找到一个似乎更好的工作。我的情况是我有一个长时间运行的循环来控制一些科学仪器,并且经常需要等待温度稳定或其他什么。我想让我的用户能够中止进程,所以我有一个中止按钮,它只是抛出一个自定义异常,我打算在最初启动进程的站点上捕获它。这似乎是一个完美的解决方案。除了由于某种原因它不起作用的事实。

如果无法使其正常工作,是否有更好的方法?

更新 2:

当我将它作为 Main() 的第一行添加时,它可以作为可执行文件工作,但不能在 VS 中工作,所以情况正好相反。疯狂的是,它似乎是无操作的。我能理解这是怎么做的。

疯了吧。

0 投票
3 回答
7636 浏览

doevents - Application.DoEvents,什么时候需要,什么时候不需要?

使用的必要性是什么,什么Application.DoEvents时候应该使用?

0 投票
1 回答
1158 浏览

.net - Windows 窗体单击事件重复自身

我对 Windows 窗体事件有一个奇怪的问题。确切地说,这是一个KryptonHeaderGroup的 ButtonSpec Click 事件,但它也发生在普通 vanillaSystem.Windows.Forms.Button中。

在单击事件中,用户界面被关闭(左侧有一个标签和一个取消按钮),然后从先前的用户输入构建一个昂贵的 LINQ 查询,编译然后执行。foreach 中有Application.DoEvents()实际执行查询的调用(它是对象的 LINQ,所以它很懒惰)。这使用户能够按下取消,并且在 之后DoEvents,测试取消标志并取消 foreach,并进行一些清理。到现在为止还挺好。

但是,当我在前几个结果出现后按下取消按钮时(标签显示已经有多少),整个 Click 事件处理程序重新启动!添加一些跟踪后,这似乎发生在前一个处理程序返回之前。换句话说,它发生在其中一个DoEvents调用中。当然,该按钮不再被按下。如果按钮在事件处理程序中被禁用,则不会发生这种情况。但是由于没有按下按钮,它不应该再次触发它的 Click 事件,不是吗?

我很困惑。显然,解决方法是禁用该按钮,但我想知道这里的实际问题可能是什么。DoEvents如果在处理程序完成之前调用事件处理程序,是否可以重新启动?DoEvents在事件处理程序中不推荐/不允许调用吗?但是,由于一切都是事件驱动应用程序中的事件处理程序,你永远不能调用它:)

回答此问题可能需要的其他提示:

  • LINQ 查询最初需要很长时间才能提供第一个结果,即在进行第一次DoEvents调用之前。
  • LINQ 查询在 GUI 线程中运行,因为允许用户访问其余应用程序没有意义,因为访问会干扰 GUI 和 LINQ 查询使用的底层 API。
  • 我知道我应该将 LINQ 查询加载到一个单独的应用程序域并在那里执行它,以便能够卸载它。但是典型用户只会运行几个不同的查询,并且生成的程序集被缓存(对于相同的查询字符串)。
  • 如果我启用了断点( sigh - Heisenberg,有人吗?)或者我稍后在查询期间取消,则问题不再发生。

我很感激任何可以解释这种行为的东西,即使这只是猜测:)

0 投票
1 回答
2476 浏览

wpf - WPF中的自定义模式窗口?

我有一个 WPF 应用程序,我想在其中创建一个具有模式行为的自定义弹出窗口。我已经能够使用与“DoEvents”等效的解决方案来破解解决方案,但是有没有更好的方法来做到这一点?这是我目前拥有的:

我的 ModalHost 是一个用户控件,旨在承载具有动画和其他支持的另一个元素。

0 投票
6 回答
12417 浏览

vb.net - .net 2010 从自定义控件库中调用 DoEvents(是的,我想)

我有一个自定义控件的库。现在有一个看起来像面板的控件,当它打开时,我想为它的垂直增长设置动画,如下所示:

如果我不在循环中调用 DoEvents 则不会显示动画,我只会得到最终高度而没有沿途的视觉反馈。

我可以从我的主 WinForm 项目中调用 DoEvents,但不能在库中调用。

我怎样才能做到这一点,而不淹没在深水里?

0 投票
1 回答
1100 浏览

vb6 - VB6 程序在 DoEvents 期间崩溃,为什么?

我有一个使用打印机对象打印文件的打印应用程序。在一台特定的机器(不是其他机器)上,这个程序在处理一些文件(大约 20 个)后会崩溃。

崩溃总是在 DoEvents 调用期间发生。

有没有人见过这样的事情?

谢谢!

0 投票
2 回答
2351 浏览

c# - Application.DoEvents() 是我唯一的选择吗(在这种情况下)?

我有一些商业设备,可以通过设备制造商提供的 .Net 库连接到这些设备 - 所以我无法控制库或设备,只有我的代码。

制造商已经设置了他们的系统,因此如果您没有通过他们的库连接到设备,那么它可以正常工作。但是,当您确实连接到他们的库时,有一个隐含的要求,即您以设备运行速度设置的速率为 Windows 消息泵提供服务。这是因为他们的库实现了一个事件系统,您可以订阅该事件系统来跟踪设备的操作,但他们假设您的应用程序代码将基于 WinForms。(但在他们的文档中没有明确说明这一点 - 只是他们的所有 2 个 .Net 示例程序都是基于 WinForms 的。)我已经向他们的技术支持确认,期望您将使用 WinForms 应用程序。

就我而言,我正在编写一个基于 C#、非 WinForms 的应用程序(实际上是一个 Windows 服务,所以我没有 UI 线程),即使我正在连接到设备,我也没有订阅任何事件。结果,我发现我需要引用 WinForms 程序集并以足够快的速度调用 Application.DoEvents() 来服务所有我不订阅的事件。

所以我的问题是:

  1. 在这种情况下,我唯一的选择是调用 Application.DoEvents() 吗?
  2. 还是有更现代的方法来做到这一点?
  3. 以 20 毫秒的速率调用 DoEvents() 的后果是什么?
  4. 不相关,但如果我编写了一个基于 WPF 的应用程序,该程序是否可能为消息泵提供服务?

编辑

我应该补充一点,如果您连接到设备并且不为 windows 消息泵提供服务(即使没有订阅他们的任何事件),那么设备会开始出现不可预测的行为。

编辑 2

此外,我用来连接库的线程也从最初的 Windows 服务线程中删除了大约 2 或 3 代。

0 投票
0 回答
505 浏览

wpf - WPF Dispatcher.PushFrame vs WinForms Application.DoEvents?

在 WinForms 中,Application.DoEvents 方法被一些人视为邪恶。任何人都可以判断它在 WPF 中的 Dispatcher.PushFrame 的对应物是否可以安全使用?

0 投票
2 回答
2823 浏览

c# - C# BackgroundWorker - 我应该如何摆脱 DoEvents

我试图找出处理单选按钮点击触发的后台工作人员的最佳方法。我创建了一个非常简单的表单,其中包含 3 个单选按钮和一个标签。每个单选按钮共享相同的事件 radioButton_CheckedChanged。如果事件完成,那么我将标签更新为“完成”。如果您在事件完成之前单击另一个单选按钮,则将标签更新为已取消。下面是我在这个快速示例中编写的代码。尽管应用程序往往按预期运行,但我担心的是 Application.DoEvents 的使用。我有什么替代方案。由于明显的原因,我在 IsBusy 时无法入睡。我是不是把这一切都错了,还是有更好的方法来做到这一点?谢谢,波科