public MergedLineReader(MergeTextReadersAsLineReaderParameters parameters, params TextReader[] readers) { endOfInput = readers.Length; Action<TextReader> routine = delegate(TextReader reader) { try { while (true) { bool exit = false; string line; lock (lockobject) { while (newLine != null) { Monitor.Wait(lockobject, 500); if (disposed) { exit = true; break; } } } if (exit) { break; } line = reader.ReadLine(); lock (lockobject) { while (newLine != null) { Monitor.Wait(lockobject, 500); if (disposed) { exit = true; break; } } if (exit) { break; } newLine = line; Monitor.PulseAll(lockobject); if (newLine == null) { break; } } } } catch (Exception e) { errorException = e; } finally { lock (lockobject) { newLine = null; Interlocked.Decrement(ref endOfInput); Monitor.PulseAll(lockobject); } } }; foreach (var reader in readers) { Thread thread; var currentReader = reader; if (parameters == MergeTextReadersAsLineReaderParameters.UseNewThreads) { thread = new Thread(() => routine(currentReader)); thread.Start(); } else if (parameters == MergeTextReadersAsLineReaderParameters.UseSystemThreadPool) { ThreadPool.QueueUserWorkItem(delegate { routine(currentReader); }); } } }
/// <summary> /// Merge the given <see cref="TextReader"/> objects as a single <see cref="TextReader"/> for /// the purpose of reading lines using the <see cref="ILineReader"/> interface from all the /// given <see cref="TextReader"/> objects without blocking on any one <see cref="TextReader"/>. /// Lines form the <see cref="TextReader"/> will generally (not guarranteed) be read in the /// order in which they become available. /// </summary> /// <param name="parameters">The paramters for reading</param> /// <param name="readers">The <see cref="TextReader"/> objects to read from</param> /// <returns>An <see cref="ILineReader"/> for reading lines from the given <see cref="readers"/></returns> public static ILineReader MergeTextReadersAsLineReader(MergeTextReadersAsLineReaderParameters parameters, params TextReader[] readers) { return(new MergedLineReader(parameters, readers)); }
/// <summary> /// Merge the given <see cref="TextReader"/> objects as a single <see cref="TextReader"/> for /// the purpose of reading lines using the <see cref="ILineReader"/> interface from all the /// given <see cref="TextReader"/> objects without blocking on any one <see cref="TextReader"/>. /// Lines form the <see cref="TextReader"/> will generally (not guarranteed) be read in the /// order in which they become available. /// </summary> /// <param name="parameters">The paramters for reading</param> /// <param name="readers">The <see cref="TextReader"/> objects to read from</param> /// <returns>An <see cref="ILineReader"/> for reading lines from the given <see cref="readers"/></returns> public static ILineReader MergeTextReadersAsLineReader(MergeTextReadersAsLineReaderParameters parameters, params TextReader[] readers) { return new MergedLineReader(parameters, readers); }
public MergedLineReader(MergeTextReadersAsLineReaderParameters parameters, params TextReader[] readers) { endOfInput = readers.Length; Action <TextReader> routine = delegate(TextReader reader) { try { while (true) { bool exit = false; string line; lock (lockobject) { while (newLine != null) { Monitor.Wait(lockobject, 500); if (disposed) { exit = true; break; } } } if (exit) { break; } line = reader.ReadLine(); lock (lockobject) { while (newLine != null) { Monitor.Wait(lockobject, 500); if (disposed) { exit = true; break; } } if (exit) { break; } newLine = line; Monitor.PulseAll(lockobject); if (newLine == null) { break; } } } } catch (Exception e) { errorException = e; } finally { lock (lockobject) { newLine = null; Interlocked.Decrement(ref endOfInput); Monitor.PulseAll(lockobject); } } }; foreach (var reader in readers) { Thread thread; var currentReader = reader; if (parameters == MergeTextReadersAsLineReaderParameters.UseNewThreads) { thread = new Thread(() => routine(currentReader)); thread.Start(); } else if (parameters == MergeTextReadersAsLineReaderParameters.UseSystemThreadPool) { ThreadPool.QueueUserWorkItem(delegate { routine(currentReader); }); } } }