【问题标题】:How to create a periodic polling process?如何创建定期轮询流程?
【发布时间】:2014-12-04 15:58:05
【问题描述】:

我正在寻找有关如何使用最新技术创建定期轮询过程 [应用程序] 的建议/指导/示例。

我有一个 Web 应用程序,它根据用户操作将条目插入到队列表中。该条目表示做某事的请求。一旦条目被处理,它将从队列中删除。在处理之前,队列中可能有超过 1 个请求。

我想每 3 分钟轮询一次该队列表,每 7 分钟 24 分钟,然后启动一个“进程”来处理请求。

这个定期轮询过程 [应用程序] 应该是控制台应用程序、WCF 服务还是常规 Web 服务?我是否应该使用多线程技术来处理在给定的“轮询”时间(每 3 分钟)可能在队列中的多个请求?

我在 Google 时看到过一些民意调查示例,但它们似乎过时了。有些使用线程,有些使用任务、计时器等。

有些困惑,什么是最好的方法。任何“最佳实践”建议/指导/示例将不胜感激。

【问题讨论】:

  • 没有“最佳实践”,全看具体情况。例如:对于我的网站,我在网页上有一些池,还有一些在控制台应用程序中。有些有线程,有些没有。你应该问问自己,使用控制台应用程序来满足我的特定需求有什么好处,我的流程可以线程化吗,...
  • the_lotus..您能分享一个您编写的具有线程的控制台应用程序示例吗?我相信我应该使用多线程来处理我使用的队列表中的多个请求。注意:我是新手。

标签: vb.net web-services wcf


【解决方案1】:

一个非常简单的方法是编写一个简单的控制台应用程序来轮询您的表并执行必要的操作。它应该执行一次并退出。从使用 Windows 任务调度程序定义的任务中每三分钟启动一次控制台应用程序。

【讨论】:

  • 如果反对者能够就他/她为什么反对我的评论提供一些意见,我会很高兴的。在类似情况下,我建议的方法对我来说非常有效。与长期运行的过程相比,它有一个优势:它避免了不可避免的管理麻烦,例如在软件发布之前停止它并在软件发布之后启动它。每个版本的 Windows 都内置了 Windows 任务计划程序,学习和使用非常简单。
  • 我创建了控制台应用程序并包含代码,以便为队列中的每个请求生成一个单独的线程。有用。正如建议的那样,我只需要从 Windows 任务调度程序中的任务启动它。似乎可以完成这项工作...谢谢。
  • 我认为您的方法对于内部一次性工具非常有效,但在商业环境中很难部署和管理。尽管如此,我还是会投票给你,这样你至少能完成比赛。
【解决方案2】:

嗯,当您需要进行远程处理时,WCF 服务主要是有用的,在您的情况下,您的轮询是自主的,因此除了单个线程之外根本不需要任何东西。做你想做的最简单的方法是一个标准的 Windows 服务。在您的服务中,在无限循环中启动一个线程。在里面,放入你的代码来检查队列并处理它,然后暂停 3 分钟(Thread.Sleep(180000))。

至于处理队列时的多线程,这取决于您,并且不会对轮询本身产生影响。要运行的任务是否预计需要很长时间?并行性会提供明显的优势吗?根据您是希望处理数千个请求还是每次轮询处理五个请求,或者要运行的任务可能需要 3 分钟以上,您的答案会有所不同。

最简单的例子:

Private Const pollingRefreshMs = 180000

Private pollingThread As New Thread(AddressOf PollQueue) With {.IsBackground = True}

Protected Overrides Sub OnStart(ByVal args() As String)
    pollingThread.Start()
End Sub

Protected Overrides Sub OnStop()
    ' Abort the polling thread when the service is stopped.
    pollingThread.Abort()
End Sub

Private Sub PollQueue()
    Dim bAborted As Boolean = False
    Do
        Try
            ' Check queue and process items here, possibly spawning a separate thread for each item...

            Thread.Sleep(pollingRefreshMs) ' Pause the polling for 3 minutes.
        Catch ex As ThreadAbortException
            bAborted = True
        End Try
    Loop Until bAborted
End Sub

【讨论】:

  • 我得到这个错误;错误 1 ​​'Public Shared Sub Main()' 有多个具有相同签名的定义。
  • 我认为这个错误是不言自明的。在任何情况下,上面的代码都是一个 sn-p,而不是一个包含所有必要部分的完整工作示例。
  • 对不起,这是新手..但我不知道如何解决该错误。有一个带有 Shared Sub Main()... 的 Service1.Designer.vb 文件,因此出现了错误。我明白你没有给出一个完整的工作示例。但是,您的示例似乎可行。我创建了一个新项目并选择了窗口服务。它创建了一个 service1.vb 文件。这就是我放置代码的地方......包含 Sub Main()。
  • 我编辑了上面的代码,现在应该可以正常工作了。
  • 好的...它编译得很好。我计划测试和权衡使用控制台应用程序与 Windows 服务的优缺点。非常感谢!
猜你喜欢
  • 2020-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
  • 2011-10-08
相关资源
最近更新 更多