Bär mit mir hier und versuchen, gehen Sie einfach auf schlechte Praxis :)C# Asynchron-Buchse über die Schnittstelle
Ich beginne das Konzept der Schnittstellen zu verstehen, und ich habe in meinem Programm implementiert .. Also ich werde versuchen, und erklären .. Ich erstelle eine Klassenbibliothek dll, die Schnittstelle mit meiner Alarmzentrale wird. Die Alarmzentrale kann zwei Arten von Verbindungen haben, IP und Serial. Also habe ich eine Schnittstelle namens IConnection implementiert.
eine Verbindung herzustellen, wie folgt:
//IConnection connection = new SerialConnection("com1", 9600);
IConnection conn = new TcpConnection(System.Net.IPAddress.Parse("192.168.0.14"), 1234);
AlarmPanel alarm = new AlarmPanel(conn, Pass);
alarm.SetLogger(logger);
alarm.Connect();
in der konkreten Klasse (? Korrekte Terminologie) ich eine Methode implementieren namens Sendmessage, die ich Agnostiker nutzen zu Transport, die gut funktioniert.
Allerdings möchte ich nun einen asynchronen Handler hinzufügen, um Adhoc-Nachrichten zu verarbeiten, die nicht als Befehl/Antwort-Stil gesendet werden.
Ich habe einen Eventhandler in meinem Haupt TCPVerbindung Klasse arbeiten:
private static void tcpReceive(Socket client)
{
try
{
// Create the state object.
StateObject state = new StateObject {workSocket = client};
// Begin receiving the data from the remote device.
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(receiveCallback), state);
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
private static void receiveCallback(IAsyncResult ar)
{
try
{
StateObject state = (StateObject)ar.AsyncState;
Socket client = state.workSocket;
// Read data from the remote device.
int bytesRead = client.EndReceive(ar);
if (bytesRead <= 0) return; // No data...
// Console.WriteLine("Ascii {0}", Encoding.ASCII.GetString(state.buffer, 0, bytesRead));
Console.WriteLine("Raw: {0}", BitConverter.ToString(state.buffer, 0, bytesRead));
processMessage(new Response {Data = state.buffer,BytesLength = bytesRead});
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, new AsyncCallback(receiveCallback), state);
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
private static void processMessage(Response resp)
{
// Do something with the message here..
}
aber ich abstrahieren will die IP-Sachen aus dem Verarbeitungscode und die process bis in meine Klasse, die die Schnittstelle verwendet bewegen zurück .. (ich weiß, dass ich das auch nicht erklären .. so lassen Sie mich wieder versuchen)
Ereignishandler in meinem Set up „Klasse TCPVerbindung: IConnection“
Schalten Sie Ereignis aus AlarmPanel Klasse Handling, die der Konstruktor wie folgt aussieht:
public AlarmPanel(IConnection connection, int Password)
{
_connection = connection;
_Password = Password;
}
, die diese Schnittstelle (IConnection) verwendet, und haben die Möglichkeit, die Process Methode aus der alarmPanel Klasse, zu sagen, so dass ich dann die gleiche Methode für nennen kann, wenn ich die Serienereignisbehandlung Arbeits bekommen ..
Sie verwenden mehrere Netzwerkschichten (7 Schichten). Sie haben eine Anwendungsschicht, die Nachrichten verarbeitet, und eine Transportschicht (seriell oder TCP). Ihre Nachrichten müssen den Nachrichtentyp enthalten, damit Ihre Anwendungsebene weiß, was mit den Nachrichten geschehen soll. Sie möchten also, dass alle Nachrichten als async behandelt werden, obwohl einige Master-Slaves und andere Ad-hoc-Nachrichten sind. Normalerweise sende ich alle Nachrichten mithilfe von Synchronisierungsmethoden. Ich würde anfangen, indem ich alle Nachrichtentypen definiere. Die Anwendungsschicht verfügt über eine Nachrichtenwarteschlange, in der die gesendeten Nachrichten mit der Antwort übereinstimmen und Adhoc übergeben wird. – jdweng