У меня есть распределенное приложение, которое запускает десятки экземпляров одного и того же приложения. Положение запуска каждого экземпляра задается временем начала процесса, чтобы позиционироваться в сетке окон. Каждый экземпляр принимает запросы на обработку из очереди БД, и они управляются процедурой хранения БД. Используемая сторонняя библиотека имеет большой объем памяти и вычислительную нагрузку и случайным образом завершает работу приложения каждые несколько сотен запросов. Имеется функция восстановления после сбоев, и при обнаружении сбоев запросы сбойного процесса помещаются в очередь для все еще работающих экземпляров приложения. Восстановление после сбоев основано на регулярной записи каждого экземпляра в файл журнала БД. Если экземпляр приложения не записал в журнал в определенный период времени, обнаруживается сбой и инициируется восстановление. Со временем запускаются новые экземпляры приложений, которые заменяют сбойные, и там, где местоположение запуска по времени запуска может размещать их поверх окон существующих экземпляров. Цель состоит в том, чтобы экземпляр перемещался в новый порядок времени запуска в регулярном цикле на основе времени запуска запущенных экземпляров. Записи журнала БД обновляются до текстового поля, и существует привязка через шаблон MVVM. Мне нужно переместить окна, основываясь на значениях, идущих в текстовое поле, чтобы они смещали местоположение в соответствии с новым порядком времени запуска все еще работающих экземпляров. Примеры основаны на событиях GUI, а не на привязках данных. Я в растерянности, как это сделать.
Я не смог найти метод для этого
Исходное местоположение задается с помощью этого кода
public MainWindow()
{
InitializeComponent();
this.Closing += Window_Closing;
WindowStartupLocation = WindowStartupLocation.Manual;
// get window hieght and width
_windowHeight = Convert.ToInt32(ConfigurationManager.AppSettings["AppHeight"]);
_windowWidth = Convert.ToInt32(ConfigurationManager.AppSettings["AppWidth"]);
// get count of apps to fit on screen
_downAppCount = (int)Math.Floor(System.Windows.SystemParameters.PrimaryScreenHeight / ( _windowHeight + 1 ));
_acrossAppCount = (int)Math.Floor(System.Windows.SystemParameters.PrimaryScreenWidth / ( _windowWidth + 1 ));
// get the start order of this process relative to all running to determine screen position
_currentProcess = Process.GetCurrentProcess();
int i = 0;
foreach ( Process proc in Process.GetProcessesByName(_currentProcess.ProcessName).OrderBy(x => x.StartTime).ToArray() )
{
i++;
if ( proc.Id == _currentProcess.Id )
{
_processOrder = i;
}
}
// set postion on screen
this.Top = Math.Floor(( (double)_processOrder - 1 ) / _acrossAppCount ) * ( _windowHeight + 1 );
this.Left = (( (double)_processOrder - 1 ) % _acrossAppCount ) * ( _windowWidth + 1 );
}
Я надеюсь менять местоположение каждого экземпляра каждый раз, когда приложение отменяет запрос, и сообщение отправляется в TextBox, указывая это.