【问题标题】:Request queuing vb.net请求排队 vb.net
【发布时间】:2023-03-03 09:47:02
【问题描述】:

我们目前有用于从中提取信息的第三方软件。

我们使用他们的 SDK 发送和接收请求,并注意到请求并不总是准确的。在排除故障并阅读(没有详细记录的)文档后,我们意识到 SDK 一次只能接收和发送一个请求。

这给我们带来了一个问题,因为我们使用 ASP.Net Web 应用程序来访问 SDK,这意味着我们有多个客户端同时访问 SDK 并发送多个请求。 SDK 所做的是,如果它在忙于当前请求时收到新请求,它会丢弃当前请求并继续处理新请求。

我想了解为请求创建排队系统的最佳方式。

我正在考虑创建一个 WCF 服务并将 instancecontexctmode 设置为单个,以便只有一个服务实例在运行。 然后将ThreadPool max threads 设置为 1 并使用它来对函数进行排队,以便一次只有一个对 SDK 的活动调用。虽然我不太了解ThreadPool 排队解决方案应该可以工作。

这是我的想法

Public Sub Sub1(var As String) 
    'Do work
    ThreadPool.QueueUserWorkItem(New WaitCallback(AddressOf Function1), "Text")
End Sub

Public Function Function1(var As String) As DataTable
    'Do Work
    Return DataTable
End Function

Sub New()
    ThreadPool.SetMaxThreads(1, 1)
End Sub

我将如何使用 ThreadPool 创建队列,或者是否有其他方法可以实现相同的结果?

Web 应用程序会等待服务的响应吗?

更新 1

我在摆弄一些代码时找到了另一种方法

如果我指定 InstanceContextMode 必须是单一的并且函数的 ReleaseInstanceMode 到 AfterCall 这会阻止任何其他函数在函数繁忙时执行。它使用实例停用(详情可找到here

<ServiceBehavior(InstanceContextMode:=InstanceContextMode.Single)>
Public Class Service1

    <OperationBehavior(ReleaseInstanceMode:=ReleaseInstanceMode.AfterCall)>
    Public Function DoWork() As String
       Return WorkDone
    End Function

End Class

这会起作用吗?我会遇到什么具体问题吗?

【问题讨论】:

  • 不知道这是否有帮助,但你看过Net MSMQ Binding吗?
  • 我尝试使用它,但似乎无法使其正常工作。 (可能只是我对它的经验几乎没有)

标签: asp.net vb.net wcf queue


【解决方案1】:

如果我是你,我更愿意做一个抽象,因为你可以控制限制第三方组件。

  1. 您可以继承第三方类(如果是类)并在里面组织队列。将其用作单例。 Singleton
  2. 使用有限线程的任务和任务工厂(非常类似于您的想法):Scheduler
  3. 您对 ThreadPool 的想法。
  4. 如果是服务,最简单的方法是创建自己的 WCF 服务,该服务将负责排队,可以由 WCF 组织:Throttling

【讨论】:

  • 感谢您的建议,尽管它并没有完全奏效,但它让我朝着正确的方向寻找。请查看我的编辑。
猜你喜欢
  • 2011-06-16
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多