Wie setzen Sie eine wiederverwendbare benannte pipe listener läuft asynchron?
Ich kann nicht finden, ein gutes Beispiel, wie man erstellen Sie eine wiederverwendbare benannte pipe-listener, der wird asynchron ausgeführt. Ich kann eine wiederverwendbare Hörer:
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 asynchronen listener:
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 scheinen, um beide gehen. Gibt es ein gutes Beispiel für diese? Ich bin auch besorgt über die teilweise gesendeten Nachrichten, da ich glaube, dass ist ein Problem mit der asynchronen Kommunikation, wie dieses.
Update:
Ich bin ein wenig näher.
pipeServer = new NamedPipeServerStream("MyPipe", PipeDirection.InOut, 1, PipeTransmissionMode.Message, PipeOptions.Asynchronous);
pipeServer.BeginWaitForConnection((a) =>
{
pipeServer.EndWaitForConnection(a);
StreamReader reader = new StreamReader(pipeServer);
while (running)
{
String text = reader.ReadLine();
if (String.IsNullOrEmpty(text) == false)
{
MessageBox.Show(text);
}
}
MessageBox.Show("Done!");
}, null);
Die erfolgreich gelesen wird, einmal, und weiter Schleifen, mit ReadLine Rückgabe eines leeren leeren string nach dem ersten erfolgreichen Lesen. Es ist also eindeutig nicht blockieren, und versucht wieder zu Lesen. Das problem ist, wenn ich senden der gleichen Nachricht ein zweites mal, wird Sie nicht abgeholt, und mein Rohr Schriftsteller sagt, dass es Fehlermeldungen 2316 (obwohl ich kann nicht herausfinden, was das bedeutet). Ich denke, ich muss einfach etwas tun, ähnlich wie diese, wo das Rohr wird gereinigt, jedes mal, wie die ersten code-Beispiel habe ich aufgeführt, aber ich habe nicht bekommen, das funktioniert noch.
- System (z.B. Win32-API) Fehler-codes gibt es hier: msdn.microsoft.com/en-us/library/ms681381(VS.85).aspx, Aber es ist kein Fehler 2316... bist du sicher, dass war der Fehler-code? Könnten Sie die vollständigen details der Ausnahme (einschließlich Typ und Nachricht?
- Sorry, ich habe es nicht, bis eben jetzt, und ich bin nicht mehr die den Fehler produziert. Dies ist der code, den es produziert, auf der writer ' s end: if (pipe == INVALID_HANDLE_VALUE) { cout << "Fehler:" << GetLastError(); }
- Es stellt sich heraus, es war Fehler 231. Die 6 war die Ausgabe von etwas anderem.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube ich habe es:
Dies zu akzeptieren mehrere Nachrichten, wie Sie kommen, und wird abgeschaltet, sobald running auf false gesetzt ist (in einem anderen thread natürlich). Es scheint das zu sein was ich brauche. Kann jemand überprüfen, ob ich nicht etwas albern?
Sind Sie nicht ein Problem mit NamedPipes mithilfe der systemeigenen (Win32) - APIs, so dass ich sehr bezweifle, dass Sie ein problem mit .NET. Aber in der native Dokumentation er sagt:
(Hinweis:
ERROR_MORE_DATA
ist 234.)Die Dokumentation sagt auch, Flagge für
FILE_FLAG_OVERLAPPED
(das native äquivalentPipeOptions.Asynchronous
):Habe ich immer verwendet asynchrone IO-Operationen mit asynchrone named pipes (d.h.
Stream.BeginRead
), aber dies bedeutet Verlust der FunktionalitätTextReader
, aber dannPipeTransmissionMode.Message
ist definiert in Bezug auf die übertragung von Gruppen von bytes sowieso.