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.
InformationsquelleAutor Mike Pateras | 2010-09-27
Schreibe einen Kommentar