0

Возникла проблема при создании отдельного потока. Вызываю с основного метода:

namespace Program
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            Patch.UI.Window = this;
            Patch.Starter();
        }
       ...

Patch.starter:

namespace Program
{
    class Patch
    {
        public static MainWindow Window = null;
    public static void Starter()
    {
        Patch startPatch = new Patch();
        System.Threading.Thread t = new System.Threading.Thread(startPatch.Start);
        t.Start();
    }
    ...

Не знаю правильно ли делаю, но в итоге нужно, чтобы метод Patch.Start() вызвался в отдельном потоке, при открытии приложения.

Сейчас выдается ошибка:

введите сюда описание изображения

Как это исправить?

Qiveq
  • 1
  • 1
    Вы пятаетесь работать с объектами GUI из соседнего потока, вот вам и ошибка... –  Aug 23 '20 at 14:50
  • Используйте пул потоков, если вам явно не обязателен отдкльный поток 2) К UI элементам можно иметь доступ только из того потока, в котором они были созданы.
  • – tym32167 Aug 23 '20 at 15:03
  • Дело в том, что раньше я запускал без потока, так:
     private void Window_ContentRendered(object sender, EventArgs e)
            {
                Patch.Start();
            }
    

    Но после того, как я убрал стандартное окно windows(сделал своё), то это событие не срабатывает. Поэтому нужно как-то запустить эту функцию после открытия приложения. Можно более подробнее получить ответ?

    – Qiveq Aug 23 '20 at 15:23
  • @ヒミコ Можно поподробнее, как мне лучше сделать тогда? Если я вызываю этот метод без отдельного потока, то ошибки нет – Qiveq Aug 23 '20 at 15:28
  • То у вас с потоком проблема, то с кастомным окном. Вы определитесь и добавьте нужную информацию в вопрос. В текущем виде не ясна ваша проблема. – tym32167 Aug 23 '20 at 15:34
  • Мне нужно любым способом вызвать метод Patch.Start() после открытия окна. – Qiveq Aug 23 '20 at 15:35
  • Вызывайте его на window_loaded – tym32167 Aug 23 '20 at 15:39
  • @tym32167 Проблема в том, что когда я вызываю так:
            {
                InitializeComponent();
                Patch.UI.Window = this;
                Patch startPatch = new Patch();
                startPatch.Start();
            }```
    То приложение открывается долго, т.к. в методе Start() стоит проверка подключения к веб-сайту. Необходимо открыть в отдельном потоке метод  Start()
    
    – Qiveq Aug 23 '20 at 15:39
  • private void Window_loaded(object sender, EventArgs e) { MessageBox.Show("123"); Patch startPatch = new Patch(); startPatch.Start(); }

    Тоже не срабатывает данный метод.

    – Qiveq Aug 23 '20 at 15:41
  • Патоки уже очень давно не используются так напрямую, ибо достаточно простейших async/await почти для всех задач (ваша не исключение). По поводу работы с контролами из другого потока - это WPF, тут принято работать с привязанными свойствами, а не контролами! Научитесь делать привязки, ну а так - это дубликат... – EvgeniyZ Aug 23 '20 at 15:43
  • @EvgeniyZ посмотрел "дубликат вопроса" - решить свой вопрос не получилось. – Qiveq Aug 23 '20 at 16:02
  • У вас есть какой то метод, который хз что делает. У вас какое то кастомное окно, кода которого Вы тоже не показали. Непонятно, какого ответа вы ожидаете с таким вопросом. Вас никто тут не сможет помочь без подробностей с вашей стороны. И не надо код в комментарии кидать, добавляйте код в вопрос. – tym32167 Aug 23 '20 at 16:09
  • Какой именно метод необходимо показать, чтобы вопрос был понятен вам? – Qiveq Aug 23 '20 at 16:19
  • Покажите метод Start, покажите строчку, в которой возникает исключение, расскажите, зачем вам другой поток? Можете показать хоть оба класса целиком в вопросе. Чем больше кода - тем понятнее. – aepot Aug 23 '20 at 16:47