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; } } }
public void RemoveThreadIdHolder(ThreadIdHolder holder) { ThreadIdHolders.Remove(holder); }