【问题标题】:how to make a small delay in vb.net?如何在 vb.net 中进行小延迟?
【发布时间】:2014-03-14 18:15:38
【问题描述】:

我想创建一个小的延迟,以便我的第一组代码顺利运行。

如何在 vb.net 中做到这一点?

编辑 1

假设我有几行这样的代码

..................Statement Line 1..............
..................Statement Line 2..............
..................Statement Line 3..............
..................Statement Line 1..............
..................Statement Line 5..............

WAIT UNTIL STATEMENT 5 IS COMPLETED

..................Statement Line 6..............
..................Statement Line 7..............
..................Statement Line 8..............
..................Statement Line 9..............
..................Statement Line 10.............

只有前五个语句执行完毕,才能执行后面五个语句

【问题讨论】:

  • 你能澄清一下吗?你想在哪里延迟执行,什么时候?你的“第一组代码”是什么?
  • 你为什么要这样做? :)
  • 语句5是什么语句?在其他线程中运行?它提供了一种设置回调的方法?
  • 第 5 行发生了什么?通常会发生什么是在第 5 行执行的代码应该告诉您它已经结束,然后,您继续执行 6。您如何保证第 5 行将在 X 秒内结束?
  • @Ranhiru Cooray 这正是我想要的成本

标签: vb.net winforms delay


【解决方案1】:

首先 - 鉴于您提供的第 6 行代码示例,在第 5 行完成之前不会执行。你不需要做任何事情;除非第 5 行正在启动外部应用程序或创建新线程。

除此之外-

Thread.Sleep 会引入延迟,但通常情况下它确实不是您想要的。

如果您使用 Thread.Sleep,则执行线程将休眠,无论您告诉它多长时间。但是您的示例代码表明您希望线程等待 UNTIL 满足某些条件。假设您正在等待一个发生在您正在休眠的线程之外的条件,那么充其量,您最终会得到一个循环保持休眠 X 毫秒,然后检查条件。

还有其他方法比这更容易(从长远来看)/更健壮。如果您真的希望在另一个线程上发生某些事情并在它完成时收到警报;考虑 BackgroundWorker 类。

http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

对于简单的多线程任务来说非常方便。您创建一个 BackgroundWorker 并使用在新线程上发生的逻辑处理它的“DoWork”事件并处理“Completed”事件(检查文档以获取正确的名称,我从内存中获取)。您调用“RunWorkerAsynch”启动流程,当“Worker_Completed”事件触发时,您可以继续执行第 6 行。

我希望这有意义/有帮助。

【讨论】:

  • 我知道后台进程,但我希望它尽可能简单。
【解决方案2】:

你想让线程休眠吗?

Thread.Sleep(100);

其中 100 是您希望线程休眠的毫秒数。

还要确保有 Imports System.Threading,如果你已经有多个线程,我假设你有。

编辑:好的,你已经添加了一些代码。不过,这应该归结为您是否有多个线程在运行,并且从您的问题来看,它看起来都在一个线程中。在这种情况下,语句 5 将始终在语句 6 运行之前首先完成。这就是代码的工作方式。唯一不会出现这种情况的情况是,语句 1-5 之一在新线程上产生了一些东西。

【讨论】:

  • 而不是导入,我建议只输入 Threading.Thread.Sleep(100)
  • @Gent 是的,在这种情况下可能会更好。反正我通常用几个线程编码,所以我习惯于线程已经被导入
  • 查看我对 Ranhiru Cooray 的评论
  • @Failed_Noob 就像我说的,代码按照它发生的顺序执行。在语句 1 完成之前,语句 2 不会发生。在语句 2 完成之前,语句 3 不会执行,等等。唯一的例外是如果您的语句之一产生了在新线程上发生的事情。是这样吗?我看到你用这个问题标记了 Winforms。您是否正在进行一些将在新线程上的 Windows 调用?如果您无法回答这个问题,我认为您可能需要发布更多代码。
【解决方案3】:

我觉得

Application.DoEvents()

应该这样做。

【讨论】:

  • 请不要在没有认真考虑的情况下这样做。 Application.DoEvents() 将允许 UI 代码运行,其中可能包括一个点击事件,该事件触发您已经在运行的相同代码。
【解决方案4】:

使用 BackgroundWorker 对象属性“IsBusy”并且在工作进程繁忙之前不允许执行第 6 行。

阅读更多关于 BackgroundWorker here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 2020-10-26
    • 1970-01-01
    • 2018-07-31
    • 2021-11-04
    相关资源
    最近更新 更多