Asyncrone Übertragung via NamedPipeClient und Server C-Sharp
Schönen gute morgen, es heißt ja der frühe Vogel fängt den Wurm, nur bei Käfern hab ich da leider kein all zu großes Glück...
Ich habe eine Anwendung, welche aus zwei Separaten Anwendungen besteht: Eine reine Backup Anwendung ohne GUI etc., die zweite Anwendung ist ein GUI zur Konfiguration des Dienstes und einigen Backup-Related-Tools.
Die GUI soll Änderungen in der Konfiguration über NamedPipes an die Backup Anwendung übertragen.
Da das Backup geänderte Dateien (eventuell, je nach Einstellung) sofort Sichern soll kommt nur eine asynchrone Übertragung in Frage.
Beim Debuggen bricht die Methode, ohne eine Ausnahme zu werfen, in Zeile 40 (string data = streamReader.ReadLine();) ab.
Meine Frage ist nun warum er dort abbricht und wie ich ihn davon abhalten kann.
Grüße
JKoenig
Ich habe eine Anwendung, welche aus zwei Separaten Anwendungen besteht: Eine reine Backup Anwendung ohne GUI etc., die zweite Anwendung ist ein GUI zur Konfiguration des Dienstes und einigen Backup-Related-Tools.
Die GUI soll Änderungen in der Konfiguration über NamedPipes an die Backup Anwendung übertragen.
Da das Backup geänderte Dateien (eventuell, je nach Einstellung) sofort Sichern soll kommt nur eine asynchrone Übertragung in Frage.
Beim Debuggen bricht die Methode, ohne eine Ausnahme zu werfen, in Zeile 40 (string data = streamReader.ReadLine();) ab.
public class IPC
{
static Dictionary<string, List<string>> receivedData = new Dictionary<string, List<string>>();
static Dictionary<string, NamedPipeServerStream> pipeServers = new Dictionary<string, NamedPipeServerStream>();
public static List<string> GetData(string pipe)
{
List<string> return_ = receivedData[pipe];
receivedData[pipe].Clear();
return return_;
}
public static bool CheckData(string pipe)
{
return receivedData[pipe].Count > 0;
}
public static void Receive(string pipe)
{
receivedData[pipe] = new List<string>();
object obj = new object[1];
obj = pipe;
pipeServers.Add(pipe, new NamedPipeServerStream(pipe, PipeDirection.InOut, 254, PipeTransmissionMode.Byte, PipeOptions.Asynchronous));
pipeServers[pipe].BeginWaitForConnection(new AsyncCallback(con), obj);
}
public delegate void DataReceiveEventHandler(EventArgs e, List<string> data);
public static event DataReceiveEventHandler OnDataReceive;
private static void con(IAsyncResult res)
{
string pipe = ((string)((object)res.AsyncState));
NamedPipeServerStream pipeServer = pipeServers[pipe];
pipeServer.EndWaitForConnection(res);
StreamReader streamReader = new StreamReader(pipeServer);
List<string> lst = new List<string>();
while (true)
{
string data = streamReader.ReadLine();
lst.Add(data);
receivedData[pipe].Add(data);
if (data == null)
break;
}
OnDataReceive(new EventArgs(), lst);
}
public static void Send(string pipe, string data)
{
NamedPipeClientStream p = new NamedPipeClientStream(pipe);
p.Connect();
StreamWriter w = new StreamWriter(p);
w.WriteLine(data);
}
}
Meine Frage ist nun warum er dort abbricht und wie ich ihn davon abhalten kann.
Grüße
JKoenig
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 180391
Url: https://administrator.de/contentid/180391
Ausgedruckt am: 24.11.2024 um 18:11 Uhr
5 Kommentare
Neuester Kommentar
Hallo JKoenig,
bin zwar der Sprache C# nicht mächtig, aber unter VB.NET hilft in den meisten fällen, der einbau einer Try-Catch Routine.
Welche dann eine schöne Fehlermeldung auswirft mit der man dann weiter auf die Suche gehen kann.
Mehr dazu, wird hier erläutert http://msdn.microsoft.com/de-de/library/0yd65esw.aspx
Grüße
DevTig
bin zwar der Sprache C# nicht mächtig, aber unter VB.NET hilft in den meisten fällen, der einbau einer Try-Catch Routine.
Welche dann eine schöne Fehlermeldung auswirft mit der man dann weiter auf die Suche gehen kann.
try {
...DAS_SOLL_ICH_TUN....
}
catch {
...WENN_FEHLER_WERFE_ES_HIER_AUS...
}
Mehr dazu, wird hier erläutert http://msdn.microsoft.com/de-de/library/0yd65esw.aspx
Grüße
DevTig
Eine andere Variante ist - nehme ich gerne beim scripten - die Ausgabe von Werten in MsgBox'en.
Die MsgBox entweder über eine eigene Constante und Prozedur ansteuern - ala Debug-Modus oder direkt an den gewünschten Stellen "reinklopfen".
Ersteres würde in einem Script ungefähr so aussehen:
Edit:
Der aufruf wäre dann:
Die MsgBox entweder über eine eigene Constante und Prozedur ansteuern - ala Debug-Modus oder direkt an den gewünschten Stellen "reinklopfen".
Ersteres würde in einem Script ungefähr so aussehen:
Const DoDebug = 1 ' Wert 1 für => zeige mir die MsgBox | Wert 0 für zeige sie mir nicht
Sub ShowDebug(ByVal strMsg)
If DoDebug = 1 Then
MsgBox(strMsg)
End If
End Sub
Edit:
Der aufruf wäre dann:
ShowDebug der-gewuenschte-wert & andere informationen
Eine weitere Möglichkeit wäre anstatt das ganze als privat aufzurufen, es mal mit public zu probieren (Zeile 31) und eventuell mal noch die Zeile 36 und folgende - wie folgt 'einpacken'
Laut MSDN die richtige Art und Weise einen StreamReader zu nutzen.
List<string> lst = new List<string>();
using (StreamReader streamReader = new StreamReader(pipeServer))
{
while (true)
{
string data = streamReader.ReadLine();
lst.Add(data);
receivedData[pipe].Add(data);
if (data == null)
break;
}
}
Laut MSDN die richtige Art und Weise einen StreamReader zu nutzen.