当前位置: 首页 > 知识库问答 >
问题:

为什么 System.Windows.Forms.Timer 中的异步回调执行 await 更多次?

唐兴思
2023-03-14

我有一个 Windows 窗体计时器,带有等待数据库操作的异步回调,为什么甚至在上一个回调尚未完成之前再次执行 await?我该如何解决这个问题?许多人说System.Windows.Forms.Timer 在执行新的回调操作之前等待上一个回调操作完成。

Private Async Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As  System.EventArgs) Handles Timer1.Tick 
  ' I have an array with 6 elements that i control 
  ' for executing database operation     
  For i=1 To 6
    If(some condition is true in array index)
      Await SaveAsync()
      'set to false the condition in array index after save
    End If
  Next       
End Sub

提前谢谢。

共有2个答案

从智明
2023-03-14

另一个答案告诉你如何解决问题,但它不能解释出了什么问题。

关于计时器选项,有一个更古老的堆栈溢出问题,它对计时器滴答声等待做出了可能具有误导性的陈述。讨论计时器时钟周期的潜在实现可能更有帮助:

  • 可以启动一个新线程以立即为即时报价提供服务
  • 可以发布通知,稍后会处理

System.Windows.Forms.Timer 执行后者。特别是,它将通知作为 Windows 消息发布,当标准消息泵看到该消息时,它会引发在 UI 线程上处理的 .NET 事件。

在大多数情况下,这意味着处理一个时钟周期将阻止下一个时钟周期发生任何事情,因为在事件处理程序执行时消息泵被阻塞。

但是,这仅在消息泵被阻止时成立。有两种可能的方式可以解除阻止:

  • 用于显式处理消息的代码,例如对 Application.DoEvents 的调用或直接针对调度程序编写的等效代码
  • Await 将隐式执行此操作,因为它将控制权返回给 UI,它将等待异步调用完成。这是设计使然,是 Await 的预期用例之一,以允许 UI 在执行异步调用时做出响应。

与使用 Await 的任何情况一样,您需要为重新进入做好准备并相应地设计代码。

锺离慈
2023-03-14

这可能是因为异步调用花费的时间比计时器间隔长。这意味着在上一个事件处理程序完成执行之前,将再次引发 Tick 事件。如果您想要的是上一个调用完成和下一个事件之间的特定间隔,则应停止计时器,进行调用,然后重新启动它:

Private Async Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As  System.EventArgs) Handles Timer1.Tick 
    Timer1.Stop()
    Await SaveAsync()
    Timer1.Start()
End Sub
 类似资料:
  • 我正在尝试为我的一个项目找到最佳实践。它是一个典型的WPF应用程序,具有显示项目列表的UI,并且有一个返回结果的数据服务。 我们异步调用服务,以免阻塞UI。我们面前有两个选择: > 使用异步 await 关键字 这需要将所有方法标记为从按钮单击一直到服务层(客户端上对服务器进行 http 调用的类)以及介于两者之间的任何方法。这种方法除了在任何地方传播异步的问题之外工作正常 使用等待者和回调在这种

  • 我得到以下警告... 警告1此异步方法缺少await运算符,将同步运行。考虑使用'await'运算符来等待非阻塞API调用,或者使用'await task.run(...)'在后台线程上执行CPU绑定的工作。

  • 问题内容: 在我的NodeJS代码中,我需要进行2或3个API调用,每个调用都会返回一些数据。在完成所有API调用之后,我想将所有数据收集到单个JSON对象中以发送到前端。 我知道如何使用API​​回调(下一个调用将在上一个调用的回调中发生)执行此操作,但这会很慢: 我知道您也可以通过promise做一些类似的事情,但我认为相同的概念适用于下一个调用要等到当前调用完成后才能执行的情况。 有没有一种

  • 问题内容: 使用 节点-6.0 执行以下操作 。 但是将上面的示例更改为使用process.nextTick()打印A,B,C 这就是我们所说的吗?谁能提供给我一个实时的例子,这将导致重大故障? 问题答案: 首先,让我解释一下代码的工作原理-请参阅添加的代码中的注释: 这与任何语言(如Java,C等)完全一样。 现在,第二个示例: 更新资料 感谢Bergi解释了Zalgo的答案是什么。现在,我更好

  • 本文向大家介绍async/await让异步操作同步执行的方法详解,包括了async/await让异步操作同步执行的方法详解的使用技巧和注意事项,需要的朋友参考一下 一.前言 我们经常会遇到这样的麻烦事,多个函数按顺序执行,返回结果却不是我们预期的顺序,原因一般是由于异步操作引起的,所以呢,我们需要一种解决方案来处理这种问题,从而使得异步操作按照同步的方式来执行,这样我们就可以控制异步操作输出结果的

  • 问题内容: 语法的哪一部分提供了该函数应在其他线程中运行并且是非阻塞的信息? 让我们考虑一下node.js中的简单异步I / O 是什么使它在后台发生的呢?任何人都可以准确地解释它,还是可以粘贴指向一些好的资源的链接?我到处看的地方都有很多关于什么是回调的信息,但是没有人解释为什么它实际上如此工作。 这不是关于node.js的特定问题,而是关于每种编程语言中回调的一般概念。 编辑: 我提供的示例可

  • 问题内容: 我整天都在整理此问题,希望有人能帮助您确定我的问题。我已经使用Ajax在我的应用程序中创建了“异步进度回调”类型的功能。当我将功能剥离到测试应用程序中时,我得到了预期的结果。见下图: 所需功能 当我使用相同的代码将功能绑定到我的单页应用程序中时,出现了一种阻塞问题,其中所有请求仅在最后一个任务完成后才得到响应。在测试应用程序中,所有请求均会依次响应。服务器报告所有请求的状态(“待定”)

  • 然而,在我下面的代码中,我希望在这两个示例中都花费相同的15秒(每个任务5秒),如本文所述。然而,第二个示例只需要5秒,同时运行所有3个示例也需要5秒来完成第二个示例。原来的文章花了5秒,但我把它改成了1秒的延迟,让它更明显。 有没有人能解释一下这是怎么回事,为什么它看起来像线程一样运行?