【发布时间】: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吗?
-
我尝试使用它,但似乎无法使其正常工作。 (可能只是我对它的经验几乎没有)