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; } }
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); } } }