I'm trying to configure some WCF stuff. Currently, I have a server which allows remote users to download files, and client. In the server, I use a ServiceHost class. I assume it should be running on a separate thread, however, the server UI (WinForms) becomes locked when someone downloads a file. Is there a way to manage the WCF threading model?
Thank you!
You shouldn't host a WCF Service inside a UI program. WCF has a very specific threading model, that will prevent your UI from running nicely.
Basically, the WCF threading scheme changes depending on the instance management behavior selected, and also when there are no requests reaching the service during a time period WCF might suspend the running thread. All of this will cause trouble with the UI.
What I do in this situations, is to create a Windows Service hosting WCF, and create a ServiceContract to expose the needed data to the monitoring UI. This UI will run independtly in it's own exe, being another client of the service, fetching the data from the service as needed.
I hope makes sense for you.
"From the same Windows Form application if you were to construct the ServiceHost instance before starting the UI thread, it will run on its own thread. That means worker threads allocated from the thread pool process messages instead of the message loop. Thus, services can truly process multiple concurrent requests. "
You should add a ServiceBehaviorAtttribute to the class implementing your service and set its UseSynchronizationContext property to false. This will cause calls to your service to be processed on their own thread.
Example:
Just remember that if you are going to update any Controls from within your service methods, you must bear in mind the cross-thread programming model of Windows Forms.