C #: Есть ли способ ненадолго получить доступ к основному потоку и вернуться к вторичному потоку?

#c# #.net #multithreading #winforms

#c# #.net #многопоточность #winforms

Вопрос:

Я использую WinForms, и я застрял. Я вызываю новый поток для выполнения некоторой проверки фоновых данных. При проверке данных необходимо создать новый элемент управления.

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

Моя цель — создать элемент управления, владельцем которого является основной пользовательский интерфейс, но событие, запущенное для создания элемента управления, происходит из вторичного потока. Как мне это сделать?

Я надеюсь, что мой вопрос не слишком запутанный

Комментарии:

1. из памяти вам нужно будет использовать backgroundworker, сделать то, что вам нужно сделать, выйти, сделать то, что вам нужно сделать, и снова войти. вы не можете быть наполовину внутри и наполовину снаружи. Взгляните на это c-sharpcorner.com/UploadFile/mahesh/backgroundworker-in-C-Sharp или learn.microsoft.com/en-us/dotnet/api /…

2. Как сделать

3. @SimonPrice Я смущен тем, что вы сказали о выходе и шаге назад. В документах говорится только о создании фоновой задачи и ее выполнении до ее завершения или отмены.

4. «Я вызываю новый поток для выполнения некоторой проверки фоновых данных». Покажите код. Async / await всегда готов помочь, если вы пишете свой код по шаблону, и нет необходимости использовать устаревший BackgroundWorker. blog.lextudio.com /…

5. @DawitAseged — Вы не можете создавать, получать доступ или обновлять элемент пользовательского интерфейса из потока, отличного от пользовательского интерфейса. Нет смысла указывать ссылку на элемент управления в фоновом потоке. Просто выполните всю работу с фоновыми данными и вызовите данные в потоке пользовательского интерфейса, а затем создайте там свои элементы управления.

Ответ №1:

Спасибо всем за все комментарии. По-видимому, самым простым способом реализовать это было использование фонового рабочего, как сказал @SimonPrice. Это намного проще, чем создавать новый поток внутри функции, которая выполняет фоновую задачу

Мне пришлось реструктурировать код, но теперь он чище и эффективнее. Более того, ошибка при работе с перекрестными потоками теперь легко обрабатывается.

Еще раз спасибо