所以我似乎遇到了与这个问题类似的问题: 命名管道性能问题
我从 C# -> Delphi 发送没有问题。但是当 Delphi 必须发送给我的那一刻,整个世界就结束了,我不知道为什么。除非 Delphi 客户端断开连接,否则所有读取操作都将永远阻塞。:-(
var stream = new NamedPipeClientStream(".",
PipeName,
PipeDirection.InOut,
PipeOptions.Asynchronous);
stream.Connect();
stream.ReadMode = PipeTransmissionMode.Message; // Have tried Byte
Pipe.InBufferSize
始终为 0。Delphi 从来没有通过任何东西。当我尝试 Pipe.Read() 时,它会冻结/阻塞,直到 ResurrectionOfChrist == true。
我有一个线程调用:
protected static byte[] ReadMessage(PipeStream stream)
{
MemoryStream memoryStream = new MemoryStream();
byte[] buffer = new byte[BUFFER_SIZE];
do
{
stream.Read(buffer, 0, BUFFER_SIZE); // Freezes here (not the loop)
memoryStream.Write(buffer, 0, buffer.Length);
} while (stream.IsMessageComplete == false);
return memoryStream.ToArray();
}
想知道是否有人对这个 Libby 的 Pipes.PAS 和 .NET 有任何经验?
我知道 Libby 定义了以下内容......我不确定这是否是我需要实现的......问题是,我无法从该死的管道中获取单个字节。
////////////////////////////////////////////////////////////////////////////////
// Mutliblock message constants
////////////////////////////////////////////////////////////////////////////////
const
MB_MAGIC = $4347414D; // MAGC
MB_START = $424D5453; // STMB
MB_END = $424D5445; // ETMB
MB_PREFIX = 'PMM';
编辑:[Per Requested Info] 所以我没有写入管道的源(我会尝试获取它),但我确实有从中读取的 Delphi 源(我正在尝试移植到 C# )
if not Assigned(NamedPipe) then
begin
NamedPipe := TPipeClient.Create(nil);
NamedPipe.PipeName := 'MyProc_' + IntToStr(GetCurrentProcessId);
NamedPipe.OnPipeMessage := OnPipeMsg;
NamedPipe.Connect(5000);
end;
procedure OnPipeMsg(Sender : TObject; Pipe : HPIPE; Stream : TStream);
MyStream.CopyFrom(Stream);
对于我的生活,我似乎无法理解我要去哪里错了。
编辑2:
Delphi Pipes Source being used is from :
http://francois-piette.blogspot.com/2013/04/inter-process-communication-using-pipes.html
located :
http://www.overbyte.be/frame_index.html?redirTo=/blog_source_code.html