WCF服务编程读书笔记(8):并发管理
Example 8-1. Manual synchronization using fragmented locking
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using System.Transactions; namespace WCFServiceProgramming.Library { [ServiceContract(SessionMode = SessionMode.Required)] public interface IMyContract { void MyMethod(); } [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)] public class MyService : IMyContract { int [] _numbers; List < string > _names; [OperationBehavior(TransactionScopeRequired = true )] public void MyMethod() { lock (_numbers) { // ... } // Don't access members here lock (_names) { // ... } } } }View Code
Example 8-2. Configure for reentrancy to allow callbacks
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using System.Transactions; namespace WCFServiceProgramming.Library { [ServiceContract(CallbackContract = typeof (IMyContractCallback))] public interface IMyContract { [OperationContract] void MyMethod(); } public interface IMyContractCallback { [OperationContract] void OnCallback(); } [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)] public class MyService : IMyContract { public void MyMethod() { IMyContractCallback callback = OperationContext.Current.GetCallbackChannel <IMyContractCallback> (); callback.OnCallback(); } } }View Code
Example 8-3. Using the service type as a shared lock
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using System.Transactions; namespace WCFServiceProgramming.Library { [ServiceContract] public interface IMyContract { [OperationContract] void MyMethod(); } [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)] public class MyService : IMyContract { public void MyMethod() { lock ( typeof (MyService)) { MyResource.DoWork(); } } } static class MyResource { public static void DoWork() { lock ( typeof (MyService)) { } } } }View Code
Example 8-4. Calling a resource on the correct synchronization context
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using System.Transactions; using System.Threading; namespace WCFServiceProgramming.Library { [ServiceContract] public interface IMyContract { [OperationContract] void MyMethod(); } class MyResource { public SynchronizationContext MySynchronizationContext { get ; } public int DoWork() { return 0 ; } } [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, ConcurrencyMode = ConcurrencyMode.Multiple)] public class MyService : IMyContract { MyResource GetResource() { return new MyResource(); } public void MyMethod() { MyResource resource = GetResource(); SynchronizationContext context = resource.MySynchronizationContext; int result = 0 ; SendOrPostCallback doWork = delegate { result = resource.DoWork(); }; context.Send(doWork, null ); } } }View Code
Example 8-5. Encapsulating the synchronization context
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using System.Transactions; using System.Threading; namespace WCFServiceProgramming.Library { [ServiceContract] public interface IMyContract { [OperationContract] void MyMethod(); } class MyResource { public int DoWork() { int result = 0 ; SendOrPostCallback doWork = delegate { result = DoWorkInternal(); }; MySynchronizationContext.Send(doWork, null ); return result; } SynchronizationContext MySynchronizationContext { get ; } int DoWorkInternal() { return 0 ; } } [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] public class MyService : IMyContract { MyResource GetResource() { return new MyResource(); } public void MyMethod() { MyResource resource = GetResource(); int result = resource.DoWork(); } } }View Code
Example 8-6. Using the form synchronization context
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; using System.Diagnostics; using System.ServiceModel; namespace WCFServiceProgramming.Library { [ServiceContract] interface IFormManager { [OperationContract] void IncrementLabel(); } [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] class MyService : IFormManager { public void IncrementLabel() { MyForm form = Application.OpenForms[ 0 ] as MyForm; Debug.Assert(form != null ); SendOrPostCallback callback = delegate { form.Counter ++ ; }; form.MySynchronizationContext.Send(callback, null ); } } partial class MyForm : Form { Label _counterLabel; SynchronizationContext _synchronizationContext; public MyForm() { // InitializeComponent(); _synchronizationContext = SynchronizationContext.Current; Debug.Assert(_synchronizationContext != null ); } public SynchronizationContext MySynchronizationContext { get { return _synchronizationContext; } } public int Counter { get { return Convert.ToInt32(_counterLabel.Text); } set { _counterLabel.Text = value.ToString(); } } } }View Code
using System; using System.Collections.Generic; using System.Linq; using System.Text; using WCFServiceProgramming.Library; using System.ServiceModel; namespace WCFServiceProgramming.Host { class Program { static void Main( string [] args) { ServiceHost host = new ServiceHost( typeof (MyService)); host.Open(); Application.Run( new MyForm()); host.Close(); } } }View Code
Example 8-7. Encapsulating the synchronization context
Example 8-8. Using a safe control
Example 8-9. Hosting the service by the form
Example 8-10. Storing form reference in a thread-relative static variable
Example 8-11. Hosting on multiple UI threads
Example 8-12. Form as a singleton service
Example 8-13. Implementing FormHost<F>
Example 8-14. Installing AffinitySynchronizer
Example 8-15. Adding thread affinity support to ServiceHost<T>
Example 8-16. Implementing ThreadAffinityBehaviorAttribute
Example 8-17. Implementing ThreadAffinityHelper
Example 8-18. Manually synchronizing the callback with ConcurrencyMode.Single
Example 8-19. Manually synchronizing callback with ConcurrencyMode.Multiple
Example 8-20. Relying on the UI synchronization context for callbacks
Example 8-21. Explicitly opening a proxy to establish synchronization context
Example 8-22. Avoiding callback deadlock on the UI thread
Example 8-23. Setting custom synchronization context for the callback
Example 8-24. Applying the CallbackThreadAffinityBehavior attribute
Example 8-25. Implementing CallbackThreadAffinityBehaviorAttribute
Example 8-26. Asynchronous contract and proxy
Example 8-27. Simple asynchronous execution sequence
Example 8-28. UsingIasyncResult.AsyncWaitHandle to block until completion
Example 8-29. Using WaitOne( ) to specify wait timeout
Example 8-30. Waiting for completion of multiple methods
Example 8-31. Managing asynchronous call with a completion callback
Example 8-32. Passing an additional parameter using a state object
Example 8-33. Relying on completion callback synchronization context
查看更多关于WCF服务编程读书笔记(8):并发管理的详细内容...