我们目前使用第三方软件从中提取信息。
我们使用他们的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应用程序是否会等待服务的响应?
我在摆弄一些代码时找到了另一种方法
如果我指定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
这是否有效,是否存在我可能遇到的任何具体问题?
答案 0 :(得分:1)
如果我是你,我宁愿再制作一个抽象,因为你可以控制限制第三方组件。