Ich kann kein gutes Beispiel für die Erstellung eines wiederverwendbaren Named Pipe-Listeners finden, der asynchron ausgeführt wird. Ich kann einen wiederverwendbaren Hörer machen:Wie implementieren Sie einen wiederverwendbaren Named Pipe-Listener, der asynchron ausgeführt wird?
NamedPipeServerStream pipeServer = new NamedPipeServerStream("MyPipe", PipeDirection.InOut);
while (true)
{
pipeServer.WaitForConnection();
StreamReader reader = new StreamReader(pipeServer);
MessageBox.Show(reader.ReadLine());
pipeServer.Disconnect();
}
und ich kann einen asychronous Zuhörer machen:
NamedPipeServerStream pipeServer = new NamedPipeServerStream("MyPipe", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous);
pipeServer.BeginWaitForConnection((a) =>
{
pipeServer.EndWaitForConnection(a);
StreamReader reader = new StreamReader(pipeServer);
MessageBox.Show(reader.ReadLine());
}, null);
Aber ich kann nicht beides in Gang zu bringen scheine. Gibt es dafür ein gutes Beispiel? Ich bin auch besorgt über teilweise gesendete Nachrichten, da ich glaube, dass dies ein Problem mit asynchroner Kommunikation wie folgt ist.
Aktualisieren: Ich bin ein wenig näher.
Das wird einmal erfolgreich gelesen und wird fortgesetzt, während ReadLine nach dem ersten erfolgreichen Lesevorgang eine leere Zeichenfolge zurückgibt. Es blockiert also eindeutig nicht und versucht erneut zu lesen. Das Problem ist, wenn ich die gleiche Nachricht ein zweites Mal sende, wird es nicht abgeholt, und mein Rohrschreiber sagt, dass es Fehler 2316 empfängt (obwohl ich nicht herausfinden kann, was das bedeutet). Ich denke, ich muss nur etwas Ähnliches tun, wo die Pipe jedes Mal aufgeräumt wird, wie das erste Codebeispiel, das ich aufgelistet habe, aber ich habe das noch nicht zum Laufen gebracht.
System (dh Win32 API) Fehlercodes sind hier: http://msdn.microsoft.com/en-us/library/ms681381(VS.85).aspx Aber es gibt keinen Fehler 2316 ... sind Sie sicher das war der Fehlercode? Könnten Sie alle Details der Ausnahme (einschließlich Typ und Nachricht?) Hinzufügen? – Richard
Entschuldigung, ich habe das erst jetzt gesehen, und ich produziere den Fehler nicht mehr. Dies ist der Code, der es am Ende des Schreibers erzeugte: if (Rohr == INVALID_HANDLE_VALUE) \t \t { \t \t \t cout << "Fehler:" << GetLastError(); \t \t} –
es stellt sich heraus, es war Fehler 231. Die 6 ausgegeben wurde, von etwas anderem –