Приложение с одним экземпляром и поведением нескольких экземпляров

Я создал приложение с одним экземпляром, используя VisualBasic.dll, но бывают ситуации, когда мне нужно создать несколько экземпляров. Мне нужно было поведение одного экземпляра для обработки поведения контекстного меню, где каждая команда контекстного меню Windows будет вызывать новый экземпляр приложения. Мне все еще нужны некоторые контекстные меню для загрузки другого экземпляра. Я решил это, создав новый контекст приложения и запустив его в новом потоке.

Образец кода

var thread = new Thread(() => ThreadOpenFile(args));
thread.TrySetApartmentState(ApartmentState.STA);
thread.Start();

Содержание темы

private static void ThreadOpenFile(string[] args)
{
  ApplicationContext appCnxt= new ApplicationContext(new newForm(args[1]));
  Application.Run(appCnxt);            
}

я такой же как

private static void ThreadOpenFile(string[] args)
{
  Application.Run(new newForm(args[1]));            
}

Это создаст новый ApplicationContext, ThreadContext и новую форму, а Application.Run свяжет ThreadContext с ApplicationContext. так же, как запуск нового приложения. Я не могу найти никакой документации, объясняющей, что происходит и кто управляет этой «новой темой», которую я создаю. Если я попытаюсь запустить новый процесс, он вызовет обработчик одного экземпляра

protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)

VisualBasic.dll и навсегда погрузиться в рекурсивный цикл, как и ожидалось. Я хочу знать, правильный ли это подход или есть лучший способ?

Эта ссылка показывает, как использовать приложение context для перехвата поведения экрана-заставки. Если есть хорошие рекомендации, я могу найти, что внутренности также ценятся.


person Krv Perera    schedule 11.02.2016    source источник
comment
Не делай этого. Используйте событие Startup, просто установите для Me.SingleInstance значение False, если вы решите, что вам не нужен один экземпляр.   -  person Hans Passant    schedule 11.02.2016
comment
@HansPassant Я понимаю, что теперь все потоки принадлежат одному и тому же процессу. Я делаю это на С#. Хотелось бы знать, почему вы говорите: «Не делай этого». Я попробовал это предложение, но, похоже, я не могу изменить его во время выполнения. Второй экземпляр будет ждать закрытия первого (созданного как отдельный экземпляр), а затем запустит новый процесс, пока он всегда будет вызывать OnStartupNextInstance. событие . Я думаю, что Visual Basic App Model использует внутреннюю структуру типа мьютекса. Я хочу запустить экземпляр (создан как отдельный экземпляр) и другой экземпляр как новый процесс (создан как другой процесс).   -  person Krv Perera    schedule 11.02.2016
comment
Не делай этого, потому что ты отстрелишь себе ногу. Вы забудете Application.EnableVisualStyles() и Application.SetUnhandledExceptionMode(). Как и ты. И вы склонны вызывать ужасы, заставляя класс SystemEvents запускать свои события в неправильном потоке, что чрезвычайно сложно диагностировать. Позволить приложению запускаться, но ждать 1-го процесса — довольно плохая идея. Что, если пользователь запустит его в третий или четвертый раз? Или энный раз яростно долбить по ярлыку, потому что он не работает? WindowsFormsApplicationBase вам в этом не поможет, придется готовить самостоятельно.   -  person Hans Passant    schedule 11.02.2016
comment
Просто я хочу, чтобы мое приложение объединяло аргументы командной строки из экземпляров, когда я щелкаю правой кнопкой мыши и вызываю команду для нескольких файлов, создаю один экземпляр и должен создавать несколько экземпляров при вызове в отдельных файлах. Знаете ли вы лучший подход для этого, мой единственный вариант на данный момент - IPC.   -  person Krv Perera    schedule 11.02.2016
comment
Чертовски XY-вопрос. Агрегирование уже поддерживается, ваш 1-й экземпляр получает событие StartupNextInstance, его свойство e.CommandLine содержит новые команды.   -  person Hans Passant    schedule 11.02.2016


Ответы (1)


Принятие ответа @HansPassant на комментарии.

Вы забудете Application.EnableVisualStyles() и Application.SetUnhandledExceptionMode(). Как и ты. И вы склонны вызывать ужасы, заставляя класс SystemEvents запускать свои события в неправильном потоке, что чрезвычайно сложно диагностировать. Позволить приложению запускаться, но ждать 1-го процесса — довольно плохая идея. Что, если пользователь запустит его в третий или четвертый раз? Или энный раз

person Community    schedule 11.02.2016