#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. это подскажет вам, в чем заключается ваша проблема. Вероятно, это проблема с перекрестным потоком, поскольку обычно вы взаимодействуете только с пользовательским интерфейсом в потоке пользовательского интерфейса.