Windows Проблема с отображением MessageBox при перекрестном потоке - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь отобразить уведомление об ошибке, используя метод MessageBox.Show () . Но у меня возникает проблема Перекрестная операция . Я использовал приведенный ниже код. Как я могу решить проблему с перекрестной резьбой? Я пробовал использовать MethodInvoker , но это не решает мою проблему. Пожалуйста, предложите мне рекомендации по решению этой проблемы.

 public static class Notification()
 {

   public static void ShowErrorMessage(IWin32Window owner, String msg)
   {
       MessageBox.Show(owner, msg, Caption+ " - " + "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
   }

}

Проблема:

Межпоточная операция недействительна: элемент управления MainPage доступен из потока, отличного от потока, в котором он был создан .

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Вот полный пример вызова MessageBox из другого потока. Хитрость здесь заключается в том, чтобы где-нибудь указать sh диспетчер (например, переменную stati c в каком-то другом классе stati c - в этом примере я помещаю переменную stati c в тот же класс, но вы можете положите его куда угодно) И затем вы просите Диспетчера вызвать какой-нибудь вызов в основном потоке. Вы можете сделать это синхронно (Invoke) или асинхронно (BeginInvoke) в соответствии с вашими потребностями.

static System.Windows.Threading.Dispatcher d; // Save the dispatcher in this global

private void Form1_Load(object sender, EventArgs e)
{
    d = System.Windows.Threading.Dispatcher.CurrentDispatcher;
    System.Threading.Timer t = new System.Threading.Timer((obj) => {
        d.Invoke(() => {
            MessageBox.Show("hi!");
        });
    }, null, 1000, System.Threading.Timeout.Infinite);

}
0 голосов
/ 28 мая 2020

Кажется, здесь есть ответ. MessageBox.show () - это небезопасно вызывать в рабочем потоке? , хотя вопрос немного вводит в заблуждение.

Кроме того, эта страница документации Microsoft подробно объясняет, как выполнять потокобезопасные вызовы элементов управления WinForm, и предоставляет вам примеры кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...