示例#1
0
        private void EnsureCurrentThreadContextWillBeReleased(int currentThreadId)
        {
            if (_releaser == null)
            {
                _releaser = new ContextStackThreadReleaser();
            }

            if (_releaser.AddContextPool(this) == false)
            {
                return;
            }

            while (true)
            {
                var copy = _threadIds;
                for (int i = 0; i < copy.Length; i++)
                {
                    if (copy[i].ThreadId == -1)
                    {
                        if (Interlocked.CompareExchange(ref copy[i].ThreadId, currentThreadId, -1) == -1)
                        {
                            _releaser.ThreadIdHolders.Add(copy[i]);
                            return;
                        }
                    }
                }

                var threads = new ThreadIdHolder[copy.Length + 1];
                Array.Copy(copy, threads, copy.Length);
                threads[copy.Length] = new ThreadIdHolder
                {
                    ThreadId = currentThreadId
                };

                if (Interlocked.CompareExchange(ref _threadIds, threads, copy) == copy)
                {
                    _releaser.ThreadIdHolders.Add(threads[copy.Length]);
                    break;
                }
            }
        }
示例#2
0
 public void RemoveThreadIdHolder(ThreadIdHolder holder)
 {
     ThreadIdHolders.Remove(holder);
 }