I recently ran into a concurrency issue with WCF on a customer's system. I'll get into the details later (though not too much detail... NDA ;) ), but it involved some testing of the various combinations of InstanceContextMode and ConcurrencyMode settings for a WCF service. The table below is an attempt to clarify the results...
InstanceContextMode ConcurrencyMode Resulting Behaviour PerCall Single New InstanceContext created per call Calls processed concurrently, because each call gets it's own instance Multiple Same as with ConcurrencyMode.Single PerSession Single New InstanceContext is created for each client proxy connection Each call is pooled and processed serially in a FIFO manner Multiple New InstanceContext is created for each client proxy connection Each call is processed as soon as it arrives A single instance of the proxy is required for concurrent processing from a single client Singlton Single Single instance of an InstanceContext Each call is pooled and processed serially in a FIFO manner Multiple Single instance of an InstanceContext Each call is processed as soon as it arrives The developer must manage thread-safetyIt's also worth noting that if you are using ServiceHost in an executable assembly, that the Main() method not be marked with the single threaded appartment attribute [System.STAThreadAttribute()]. This causes the application to be single threaded, and the additional threads will not be created regardless of the ConcurrencyMode.Multiple setting. Rather, it should be decorated with the multi-threaded appartment attribute [System.MTAThreadAttribute()].