Нитки.Начать не работает

#c# #multithreading

#c# #многопоточность

Вопрос:

Я использую функции следующего класса для вызова messagebox . Я использую поток.Запустите метод, чтобы отобразить окно сообщения. Проблема в том, что при потоке он не достигает соответствующей функции.Вызывается Start . Я что-то пропустил?

 class MessageManager
{
  string _message;
  public MessageManager(string message)
  {
    _message = message;
  }

  public void ShowBigMessage()
  {
    Thread thread = new Thread(DisplayBigMessage);
    thread.SetApartmentState(ApartmentState.STA); //Set the thread to STA
    thread.Start();

    // thread.Join(); 
  }

  public void ShowNormalMessage()
  {
    Thread thread = new Thread(DisplayNormalMessage);
    thread.SetApartmentState(ApartmentState.STA); //Set the thread to STA
    thread.Start();
    //thread.Join(); 
  }

  private void DisplayBigMessage()
  {
    BigAppMessage appMessage = new BigAppMessage(_message);
    appMessage.Show();
  }

  private void DisplayNormalMessage()
  {
    AppMessage appMessage = new AppMessage(_message);
    appMessage.ShowDialog();
  }
}
  

Это вызывается внутри потока / делегата, как показано ниже. Я добавил этот код в свою программу, потому что он вызывал

Вызывающий поток должен быть STA, потому что этого требуют многие компоненты пользовательского интерфейса.

исключение перед

 MessageManager message = new MessageManager("This is a test message.");

                    message.ShowBigMessage();





  public partial class BigAppMessage : Window
    {
        public BigAppMessage(String message)
        {
            InitializeComponent();
            myControl.setMessage(message); // mycontrol is just user control with a                   
                                           //label on it
        }       

    }
  

Комментарии:

1. Вы говорите, что он не достигает функции, потому что окно сообщения не отображается, или вы действительно установили точку останова в функции, и она никогда не попадает?

2. Опубликуйте классы AppMessage и BigAppMessage, если вам нужна помощь. Я собираюсь предположить, что вы неправильно настроили дескриптор владельца для MessageBox. Вы также никогда не вызываете ShowBigMessage() , поэтому не шокирует, что ваш MessageBox не отображается

3. Когда вы на самом деле опубликуете код, который вы пытаетесь использовать, я подумаю о том, чтобы изменить свой отрицательный голос на положительный. На данный момент на вопрос НЕВОЗМОЖНО ответить. Ваш точный вопрос также не совсем ясен, поскольку ваш код не делает ничего существенного.

4. я установил точку останова, и она никогда не попадает.

5. @logeeks — Опубликуйте код, в котором вы на самом деле вызываете ShowNormalMessage() , потому что вы этого не делаете в опубликованном вами коде.

Ответ №1:

Метод Show() требует цикла сообщений. Исправить:

   private void DisplayBigMessage()
  {
    Application.Run(new BigAppMessage(_message));
  }
  

В метод ShowDialog() уже встроен цикл сообщений. Использование потока для простого отображения окна не имеет никаких преимуществ, только проблемы.

Комментарии:

1. окно сообщения должно отображаться, когда программа сталкивается с какой-либо проблемой.

2. Ну, для этого и используются окна сообщений. Примером проблемы может быть исчезновение его за другим окном, потому что вы отображаете его в потоке. Полностью незаметно для пользователя, поскольку он не является модальным для пользовательского интерфейса и не имеет кнопки на панели задач.

Ответ №2:

В Visual studio перейдите в раздел Debug-> Exceptions и установите флажок «выброшено» рядом с исключениями CLR. это подскажет вам, в чем заключается ваша проблема. Вероятно, это проблема с перекрестным потоком, поскольку обычно вы взаимодействуете только с пользовательским интерфейсом в потоке пользовательского интерфейса.