1

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?

Community
  • 1
  • 1
Juan Gous
  • 249
  • 1
  • 2
  • 20
  • Don't know if this would help, but have you looked at the [Net MSMQ Binding](http://msdn.microsoft.com/en-us/library/ee960174(v=vs.110).aspx)? – Tim Apr 15 '14 at 17:44
  • I tried using it but cant seem to get it to work correctly. (It may just be that my experience with it is little to nothing) – Juan Gous Apr 16 '14 at 12:47

1 Answers1

1

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
Community
  • 1
  • 1
Igor Tkachenko
  • 1,120
  • 7
  • 17
  • Thanks for the advice although it didn't all work it sent me searching in the right direction. Please see my edit. – Juan Gous Apr 16 '14 at 12:49