Сохранить поток, ожидающий ответа Windows? - PullRequest
1 голос
/ 26 июля 2010

У меня есть приложение для форм Windows, которое запускает два потока одновременно, причем поток пользовательского интерфейса работает на панели задач.Поток пользовательского интерфейса на самом деле выполняет совершенно отдельные функции от другого процесса, но в случае, если новый пользователь входит в приложение, мне нужно открыть окно настройки из потока, не являющегося пользовательским интерфейсом.

Вот код из моего Program.cs:

static void Main()
    {
        ThreadStart start = new ThreadStart(Waiting.wait);
        Thread waiting = new Thread(start);
        waiting.Start();
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(true);
        Application.Run(TaskBarIcon.getInstance());
    }

В настоящее время, прежде чем TaskBarIcon сможет полностью создать экземпляр, необходимо завершить работу одного метода конфигурации в ожидающем потоке.Это достигается путем передачи блокировки назад и вперед.Я хотел бы, чтобы это меню настройки появлялось во время обработки метода конфигурации, и чтобы метод ждал завершения, пока меню настройки не будет выполнено.Однако, если я не запускаю меню настройки непосредственно из метода Application.Run (), я не могу даже заставить меню отображаться правильно.

Я очень новичок в C # .... смог бы сделать это быстро в Java, но C #, похоже, работает по-другому.

Буду очень признателен за любые предложения или решения!

badPanda

1 Ответ

1 голос
/ 26 июля 2010

Я подозреваю, что это происходит из-за того, что форма меню настройки не получает сообщения Windows в рабочем потоке, и поэтому она не отображается. Для правильной работы всех форм и элементов управления необходим насос сообщений. Существуют различные способы запуска рассылки сообщений, но два наиболее применимых для вас:

  • Application.Run
  • Form.ShowDialog

Если вы вызовете ShowDialog в форме меню настройки, то оно должно появиться в рабочем потоке. Конечно, вызов блокируется до тех пор, пока форма не будет закрыта, так что это предотвратит выполнение оставшейся части метода конфигурации, но опять же это может быть именно тем, что вы хотите.

Если вы хотите, чтобы основной поток пользовательского интерфейса (вызывающий Application.Run) ожидал завершения этого метода конфигурации, используйте WaitHandle, чтобы сообщить о завершении задачи конфигурации. Это может выглядеть следующим образом.

static void Main() 
{ 
  var configured = new ManualResetEvent(false);
  var worker = new Thread(
    () =>
    {
       // Do some stuff here.

       CallYourConfigurationMethod();
       configured.Set() // Signal that configuration is complete.

       // Do some more stuff here.
    });
  worker.Start(); 
  configured.WaitOne();
  Application.EnableVisualStyles(); 
  Application.SetCompatibleTextRenderingDefault(true); 
  Application.Run(TaskBarIcon.getInstance()); 
} 
...