Juan Gous
Juan Gous

Reputation: 249

Request queuing vb.net

We currently have third-party software that we use to extract information from.

We use their SDK to send and receive request and noted that the request aren't always accurate. After troubleshooting and reading (not well documented) documentation we realised that the SDK can only receive and send one request at a time.

This causes a issue for us as we are using an ASP.Net web application to access the SDK which means that we have multiple clients that access the SDK at the same time and send multiple request. What the SDK does is if it get a new request while busy with a current request it discards the current request and continues with the new request.

I would like to find out what would be the best way of creating a queuing system for the requests.

I was thinking of creating a WCF service and set the instancecontexctmode to single so that there is only one instance of the service running. Then setting the ThreadPool max threads to 1 and using it to queue the functions so that there is only one active call to the SDK at a time. Although I do not know much about ThreadPool queuing the solution should work.

Here is what I have in mind

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

How would I create the queueing using ThreadPool or is there another way to accomplish the same result?

Will the web application wait for a response from the service?

Update 1

I found another way while fiddling with some code

If I specify the InstanceContextMode must be single and the the function's ReleaseInstanceMode to AfterCall this blocks any other functions from executing while the function is busy. It uses instance deactivation (Details found here)

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

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

End Class

Will this work and is there any specific problems that I could run into?

Upvotes: 1

Views: 263

Answers (1)

Igor Tkachenko
Igor Tkachenko

Reputation: 1120

If I was you I would prefer to make one more abstraction, as you can control restriction third party component.

  1. You can inherit third party class (if it's a class) and organize queue inside. Use it as a singleton. Singleton
  2. Using tasks and task factory with limited threads (very similar to your idea): Scheduler
  3. Your idea with ThreadPool.
  4. In case it's a service, the easiest way is to create your own WCF service which will be responsible for queueing, which can be organized by WCF: Throttling

Upvotes: 1

Related Questions