медведя со мной здесь и попытаться идти легко на плохой практике :)C# асинхронного гнездо через интерфейс
Я начинаю понимать концепцию интерфейсов и я реализовал один в моей программе .. Так что я буду стараться и объясните .. Я создаю DLL библиотеки классов, которые будут взаимодействовать с моей панелью тревоги. Панель сигнализации может иметь два типа соединения: IP и Serial. Поэтому я реализовал интерфейс для этого, называемого IConnection.
и создать соединение следующим образом:
//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();
в конкретном классе (? Правильной терминологии) я реализую метод, называемый SendMessage, который я использую, чтобы быть агностиком транспорт, который работает хорошо.
Однако теперь я хочу добавить обработчик async для обработки сообщений adhoc, отправленных обратно, которые не являются сообщениями стиля командной строки/ответа.
У меня есть EventHandler, работающий в моей основной TCPConnection Класс:
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..
}
Однако я хочу, чтобы абстрагировать IP материал из кода обработки и перемещения ProcessMessage обратно в мой класс, который использует интерфейс .. (Я знаю, что я не объяснить это хорошо .. поэтому позвольте мне еще раз попробовать)
Настройка обработчика событий в моей «класс TCPConnection: IConnection»
Включите обработку от AlarmPanel класса, который конструктор выглядит как событие:
public AlarmPanel(IConnection connection, int Password)
{
_connection = connection;
_Password = Password;
}
, который использует этот интерфейс (IConnection), и быть в состоянии сказать, использовать метод ProcessMessage от alarmPanel класса, так что я могу затем вызвать тот же метод, когда я получаю серийные обработки событий работать ..
Вы используете несколько слоев сети (7 слоев). У вас есть сообщения для обработки прикладного уровня и транспортный уровень (последовательный или TCP). Ваши сообщения должны содержать тип сообщения, чтобы ваш уровень приложения знал, что делать с сообщениями. Поэтому вы хотите, чтобы все получаемые сообщения обрабатывались как асинхронные, хотя некоторые из них являются подчиненными и другими adhoc. Обычно я отправляю все сообщения, используя методы синхронизации. Я бы начал с определения всех типов сообщений. Уровень приложения будет иметь очередь сообщений, в которой сообщения отправки будут сопоставляться с ответом и позволят adhoc пройти. – jdweng