#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. Это намного проще, чем создавать новый поток внутри функции, которая выполняет фоновую задачу
Мне пришлось реструктурировать код, но теперь он чище и эффективнее. Более того, ошибка при работе с перекрестными потоками теперь легко обрабатывается.
Еще раз спасибо