Example #1
0
 private WorkContext(int initialWorkCapacity, int dedicatedThreads, string name, bool disposable)
 {
     if (dedicatedThreads < 0)
     {
         throw new ArgumentOutOfRangeException("dedicatedThreads", "dedicatedThreads < 0");
     }
     else
     {
         _dedidatedThreadMax = dedicatedThreads;
         _works = new QueueBucket<Work>(initialWorkCapacity);
         Converter<int, Thread> valueFactory = null;
         if (StringHelper.IsNullOrWhiteSpace(name))
         {
             if (_dedidatedThreadMax == 1)
             {
                 valueFactory = input => new Thread(DoWorks)
                 {
                     Name = string.Format("Dedicated Thread on Work.Context {0}", _id),
                     IsBackground = true
                 };
             }
             else if (_dedidatedThreadMax > 1)
             {
                 valueFactory = input => new Thread(DoWorks)
                 {
                     Name = string.Format("Dedicated Thread {0} on Work.Context {1}", input, _id),
                     IsBackground = true
                 };
             }
         }
         else
         {
             if (_dedidatedThreadMax == 1)
             {
                 valueFactory = input => new Thread(DoWorks)
                 {
                     Name = string.Format("Dedicated Thread on {0}", name),
                     IsBackground = true
                 };
             }
             else if (_dedidatedThreadMax > 1)
             {
                 valueFactory = input => new Thread(DoWorks)
                 {
                     Name = string.Format("Dedicated Thread {0} on {1}", input, name),
                     IsBackground = true
                 };
             }
         }
         _threads = new LazyBucket<Thread>
             (
                 valueFactory,
                 dedicatedThreads
             );
         _id = Interlocked.Increment(ref _lastId) - 1;
         _event = new AutoResetEvent(false);
         _work = true;
         _disposable = disposable;
     }
 }
Example #2
0
 private void DisposeExtracted()
 {
     try
     {
         _work = false;
         while (Thread.VolatileRead(ref _dedidatedThreadCount) > 0)
         {
             _event.Set();
         }
         _event.Close();
         _event = null;
     }
     finally
     {
         try
         {
             //Empty
         }
         finally
         {
             _work = false;
             _threads = null;
             GC.SuppressFinalize(this);
         }
     }
 }