1
private void OnAddTableEventHandler(object sender, long id)
{       
   var window = new HintWindow();
}

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

  • @EvgeniyZ вопрос станет дубликатом, если в вопросе по вашей ссылке добавить информацию о том, как получить диспетчер для wpf. Если ты внутри ui контрола - это одно дело, если ты снаружи - другое дело, если ты уже в ui потоке - третье дело. – tym32167 Jul 19 '20 at 15:52
  • @tym32167 Ну не знаю, для меня лично достаточно строки из дубликата (Dispatcher.BeginInvoke((Action)(() => this.label1.Content = result));) для решения таких проблем, а уже как получить диспетчер, дело десятое... – EvgeniyZ Jul 19 '20 at 15:58
  • @EvgeniyZ автор в курсе про диспетчер, но он не знает, как его получить (см его комментарий под ответом), а код Что вы привели работает только из-под ui контрола, я ес честно хз где у автора выполняется его функция, в ui или нет, потому указал способ получения диспетчера из любой точки приложения. – tym32167 Jul 19 '20 at 16:04
  • @tym32167 Ну, пусть будет так. Я все же буду и дальше считать это дубликатом, хоть и не идеальным. – EvgeniyZ Jul 19 '20 at 16:06
  • @EvgeniyZ okay.. – tym32167 Jul 19 '20 at 16:10
  • @EvgeniyZ не дубликат. Ты написал вызов из ui. А мне не из ui нужен был, как и написал tym32167 – Денис Матюшкин Jul 19 '20 at 16:12
  • @ДенисМатюшкин Понимаете в чем дело... Для начала ваш вопрос звучит как "Получаю ошибку Вызывающим потоком должен быть STA", без указания что пробовали такой то способ, он не работал. Ответ "Используйте диспетчер". Такой же вопрос и такой же ответ можно найти по ссылке, так что для меня лично это явный дубликат. Что касательно диспетчера, то это тоже самое, что если сейчас задать вопрос, с таким же текстом, только будет например не HintWindow, а TextBox, просто смена контрола. Что, будем теперь под каждый контрол задавать такие вопросы и давать ответы? Так что извините, не убедили. – EvgeniyZ Jul 19 '20 at 16:24

1 Answers1

4

Используйте диспетчер, чтбы прокинуть вызов в основной поток

Application.Current.Dispatcher.Invoke(() => 
{
    var window = new HintWindow();
});
tym32167
  • 32,857
  • cпасибо!) пробовал Dispatcher.CurrentDispatcher.Invoke не получалось, а так заработало – Денис Матюшкин Jul 19 '20 at 08:02
  • 1
    Это потому что Dispatcher.CurrentDispatcher пытается создать диспетчер в текущем потоке, а вариант из ответа использует диспетчер из главного ui потока. – tym32167 Jul 19 '20 at 15:48