请求排队vb.net

时间:2014-04-15 13:08:01

标签: asp.net vb.net wcf queue

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

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

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

我想找出为请求​​创建排队系统的最佳方法。

我正在考虑创建一个WCF服务并将instancecontexctmode设置为单一,以便只有一个服务实例在运行。 然后将ThreadPool最大线程设置为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

这是否有效,是否存在我可能遇到的任何具体问题?

1 个答案:

答案 0 :(得分:1)

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

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