using System.Collections;
using System.Collections.Generic;
public T Value { get; set; }
public bool Done { get; set; }
private ManualResetEvent write;
private ManualResetEvent read;
this.write = new ManualResetEvent(true);
this.read = new ManualResetEvent(false);
public void Send(T value) {
this.item = new Item() { Value = value, Done = false };
this.item = new Item() { Value = default(T), Done = true };
public class Source<T> : IEnumerable<T> {
private RwLock<T> rwlock;
public Source(Action<RwLock<T>> resolver) {
this.rwlock = new RwLock<T>();
ThreadPool.QueueUserWorkItem(state => {
private IEnumerable<T> Read() {
var item = this.rwlock.Read();
public IEnumerator<T> GetEnumerator()
=> this.Read().GetEnumerator();
IEnumerator IEnumerable.GetEnumerator()
=> this.Read().GetEnumerator();
static Source<int> Numbers()
=> new Source<int>(sender => {
public static void Main(string[] args) {
foreach (var value in source) {
Console.WriteLine(value);