Так же в требованиях работа этого всего в многопоточном режиме, поэтому пул придется блокировать на время получения/возвращения узлов.
например public static MyConnectionToServer
{
private static readonly TCPConnection Connection;
void OnMessageReceived(string message)
{
// все сообщения наследовать например от MessageBase но в подклассах еще новые данные, в MessageBase только string MessageType
MessageBase messageBase = Deserialize(message);
Type deserializeType = GetDeserializeType(messageBase.MessageType);
MessageBase concreteMessage = Deserialize(deserializeType , message);
Dispatch(messageBase.MessageType, concreteMessage);
}
private void Dispatch(string messageType, T concreteMessage)
{
// юзать Listeners по messageType и в них передать concreteMessage
}
void AddListener(string messageType, Action onReceived)
{
// добавить в Dictionary>
}
}
а из каждого Контроллера Окна вызывать
AddListener("type1", (message) => ProcessType1(message));
и в конце RemoveListener("type1") чтобы не утекло
AsyncManager
{
Queue<IoTaskWithCallback<IoTas>> tasks;
void AddTask(IoTask task, Action onComplete, Action onError)
}
IoTaskWithCallback {
IoTask Task;
Action OnComplete;
Action OnError;
}
разница в Razor и EditorTemplate
по сути добавиь клиентский контрол в JS\HTML - берете JS либу
как соединить с C# и серверной моделью - надо разбираться во фреймворке
я не эксперт, и вы видимо тоже