C #, как достичь чего-то в текущем потоке, который создан в другом потоке?
==========================================================================

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

Я использовал thread\_1 для показа формы, но он просто показывает ее секунду (возможно, thread\_1 завершил работу и закрыл форму, но я сказал, что IsAlive жив!). Thread\_2 пытается добраться до texBox, созданного в основном потоке, но он показывает мне:

"Cross-thread operation not valid: Control 'textBox2' accessed from a
 thread other than the thread it was created on."

Я не знаю, как решить первую проблему, но я решил вторую проблему с BackgroundWorker, но мне нравится делать это с потоком. Там в любом случае?

 вы хотите удалить поток, который вы называете потоком 1, поскольку ваш пользовательский интерфейс уже будет в потоке при запуске (все программы имеют единственный основной поток, в котором они запускаются). Тем не менее вы были на правильном пути, вы хотите поместить любые долгосрочные задачи в отдельный поток, чтобы он не блокировал пользовательский интерфейс. Единственная хитрость в том, что вы не можете напрямую манипулировать объектами пользовательского интерфейса из фоновых потоков, ими нужно манипулировать из потока, которому они принадлежат (о чем говорит сообщение об ошибке).

К счастью, есть очень простой способ сделать это в .NET. В WPF вы используете UiComponent.Dispatcher.Invoke (), а Winforms просто используют UiComponent.Invoke (). Это позволяет фоновому потоку перейти к потоку, в котором находится компонент пользовательского интерфейса, для его обновления.

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

Попробуй это

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



[Запись в TextBox из другого потока?](https://stackoverflow.com/questions/519233/writing-to-a-textbox-from-another-thread)Я думаю, что это ответ на ваш вопрос о доступе к объектам, созданным в другой теме.

Что-то пошло не так с ссылкой в первый раз.