好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

WCF服务编程读书笔记(8):并发管理

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):并发管理的详细内容...

  阅读:36次