Size: a a a

2021 May 03

Dv

Dr. Friedrich von Ne... in pro.net
У тебя хендл ещё не создался у формы. Я не уверен, когда он поднимается в реальности, надо подебажить. Думаю, тебе надо будет основной поток подзадержать до того момента. Ну или использовать SynchronizationContext.

Есть способ его создать заранее, запостить вещи ему в очередь, а потом вроде стартовать Application.Run с этим контекстом.
источник

AT

Alexey Tkachenko in pro.net
тут же чёрным по белому написано, что к моменту твоего invoke форма ещё не создана и нет хэндла, которому надо послать сообщение, в которое упаковывается делегат
источник

AT

Alexey Tkachenko in pro.net
стартуй свою логику хотя бы в событии Loaded
источник

Dv

Dr. Friedrich von Ne... in pro.net
А мне что-то кажется, что форма там вообще не нужна.
источник

AT

Alexey Tkachenko in pro.net
почему?
источник

AT

Alexey Tkachenko in pro.net
WinForms прокачивает сообщения только через форму
источник

V

Vyacheslav in pro.net
источник

Dv

Dr. Friedrich von Ne... in pro.net
Um?
источник

AT

Alexey Tkachenko in pro.net
и правда... занятно
источник

Dv

Dr. Friedrich von Ne... in pro.net
Из представленного кода у меня сложилось впечатление, что товарищ использует тут форму только потому, что есть одноимённая сигнатура у Application.Run, и ему нужен только цикл обработки сообщений, а вовсе не форма. И потом она же используется для Invoke (а для этого лучше бы использовать контекст).
источник

V

Vyacheslav in pro.net
Для гуру event'ов есть Application.Run() без параметров.
источник

Dv

Dr. Friedrich von Ne... in pro.net
По-моему, обозначенная задача, как я её понял, решалась даже не через ApplicationContext, а через SynchronizationContext.SetSynchronizationContext.
источник

Dv

Dr. Friedrich von Ne... in pro.net
var windowsFormsSynchronizationContext = new WindowsFormsSynchronizationContext();
SynchronizationContext.SetSynchronizationContext(windowsFormsSynchronizationContext);
windowsFormsSynchronizationContext.Post(new SendOrPostCallback(_ =>
{
   MessageBox.Show("xxx");
}), null);
Application.Run();


Я вот так делал.
источник

V

Vyacheslav in pro.net
Или еще проще.
источник

Dv

Dr. Friedrich von Ne... in pro.net
Это гарантирует, что моё событие окажется первым в очереди.
источник

V

Vyacheslav in pro.net
Можно просто вручную же события обрабатывать :/
источник

V

Vyacheslav in pro.net
Особенно когда нужно задиспозить когда хочешь
источник

Dv

Dr. Friedrich von Ne... in pro.net
Ну, если можно — то можно.
источник

V

Vyacheslav in pro.net
var thread = new Thread(() =>
{
   Application.EnableVisualStyles();
   Application.SetCompatibleTextRenderingDefault(true);

   while (!_cancellationTokenSource.IsCancellationRequested)
   {
       if (_formsToShow.TryDequeue(out var formToShow))
       {
     _formsToDestroy.Enqueue(formToShow);
     formToShow.Show();
       }
       
       Application.DoEvents();
       Thread.Sleep(updateIntervalMs);
   }

   while (_formsToDestroy.TryDequeue(out var formToDestroy))
   {
       formToDestroy.Close();
       formToDestroy.Dispose();
   }
});
источник

V

Vyacheslav in pro.net
Чуть-чуть костыльно, есть еще что исправить
источник