我需要运行一个任务的背景,读输入从一个位置和进程的这一行的时间。我想背景的任务框直到用户类型中的一些文字变成现场和点击次提交按钮。是有一些味道的位置,这将阻止一直到文字可用和可以让你以某种方式增加更多的文本为基础的来源?

我认为,一个StreamReader和StreamWriter指向同一流可能的工作,但它似乎没有。StreamReader认为,流是空的开始,从来没有检查一次。

我认识到,它会更容易写一ProcessLine()方法,并呼吁它每当用户击时提交按钮。然而,我想设计一个插件的建筑,和我想的插件看起来像老式的控制台应用程序的流输入和输出流。我想插在的输入流只是块,直到用户的点击次提交按钮有一些输入的文本。

有帮助吗?

解决方案

它似乎没有执行这个-这是很奇怪,因为我同意,这将是一个有用的结构。但是,它应该是简单的编写。像这样的东西应该工作:

  public class BlockingStream: Stream
  {
    private readonly Stream _stream;

    public BlockingStream(Stream stream)
    {
      if(!stream.CanSeek)
        throw new ArgumentException("Stream must support seek", "stream");
      _stream = stream;
    }

    public override void Flush()
    {
      lock (_stream)
      {
        _stream.Flush();
        Monitor.Pulse(_stream);
      }
    }

    public override long Seek(long offset, SeekOrigin origin)
    {
      lock (_stream)
      {
        long res = _stream.Seek(offset, origin);
        Monitor.Pulse(_stream);
        return res;
      }
    }

    public override void SetLength(long value)
    {
      lock (_stream)
      {
        _stream.SetLength(value);
        Monitor.Pulse(_stream);
      }
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
      lock (_stream)
      {
        do
        {
          int read = _stream.Read(buffer, offset, count);
          if (read > 0)
            return read;
          Monitor.Wait(_stream);
        } while (true);
      }
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
      lock (_stream)
      {
        long currentPosition = _stream.Position;
        _stream.Position = _stream.Length;
        _stream.Write(buffer, offset, count);
        _stream.Position = currentPosition;
        Monitor.Pulse(_stream);
      }
    }

    public override bool CanRead
    {
      get
      {
        lock (_stream)
        {
          return _stream.CanRead;
        }
      }
    }

    public override bool CanSeek
    {
      get
      {
        lock (_stream)
        {
          return _stream.CanSeek;
        }
      }
    }

    public override bool CanWrite
    {
      get
      {
        lock (_stream)
        {
          return _stream.CanWrite;
        }
      }
    }

    public override long Length
    {
      get
      {
        lock (_stream)
        {
          return _stream.Length;
        }
      }
    }

    public override long Position
    {
      get
      {
        lock (_stream)
        {
          return _stream.Position;
        }
      }
      set
      {
        lock (_stream)
        {
          _stream.Position = value;
          Monitor.Pulse(_stream);
        }
      }
    }
  }

其他提示

我觉得你会好得多创建一个事件在你的主要应用程序,提出了当用户提交。该文本的数据将通过在该事件args.每个插件寄存器的事件处理程序事件,并处理的数据通过在事件时提出的。这使许多插件来处理数据从一个单一的提议没有很多的管道工作在你的一部分,并意味着插件是能闲置,直到事件提出的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top