К сожалению, подсказка Буллера у меня не сработала, потому что ReadLine
может блокировать.
Но с ответом Зака на Альтернатива StreamReader.Peek и Thread.Interrupt Я придумал следующее:
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool PeekNamedPipe(SafeHandle handle,
byte[] buffer, uint nBufferSize, ref uint bytesRead,
ref uint bytesAvail, ref uint BytesLeftThisMessage);
static bool SomethingToRead(SafeHandle streamHandle)
{
byte[] aPeekBuffer = new byte[1];
uint aPeekedBytes = 0;
uint aAvailBytes = 0;
uint aLeftBytes = 0;
bool aPeekedSuccess = PeekNamedPipe(
streamHandle,
aPeekBuffer, 1,
ref aPeekedBytes, ref aAvailBytes, ref aLeftBytes);
if (aPeekedSuccess && aPeekBuffer[0] != 0)
return true;
else
return false;
}
В моем случае дополнительный вызов P / Invoke не является проблемой.