gpt4 book ai didi

.net - .NET 中是否存在阻塞 StreamReader、TextReader 或 StringReader?

转载 作者:行者123 更新时间:2023-12-01 08:42:56 25 4
gpt4 key购买 nike

我想运行一个后台任务,从 TextReader 读取输入并一次处理一行。我希望后台任务阻塞,直到用户在字段中键入一些文本并单击提交按钮。是否有某种 TextReader 风格会阻止直到文本可用并让您以某种方式向底层源添加更多文本?

我认为指向同一个 MemoryStream 的 StreamReader 和 StreamWriter 可能会起作用,但似乎不起作用。 StreamReader 在开始时看到 MemoryStream 是空的,并且不再检查。

我意识到编写 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);
}
}
}
}

关于.net - .NET 中是否存在阻塞 StreamReader、TextReader 或 StringReader?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/248502/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com