Example #1
0
            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); });
                    }
                }
            }
Example #2
0
 /// <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));
 }
Example #3
0
 /// <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);
 }
Example #4
0
            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); });
                    }
                }
            }