.NET 4.x Как перейти к основному потоку из фонового - C#

Узнай цену своей работы

Формулировка задачи:

Есть некая программа со сплешем, в сплеше создается поток который выполняет работу и выводит статус того что он делает. Как можно вернуться из этого потока в основной и заставить продолжить код Вот код класса
        public Splash()
        {
 
            Thread _thread = new Thread(new ThreadStart(ThreadWorker));
            InitializeComponent();
            state.Text = "";
            state.Text = "Запускаем...";
            _thread.Name = "StartupThread";
            _thread.IsBackground = true;
            _thread.Start();
            // вернуться сюда и продолжить код
            Main _mainfrm = new Main();
            _mainfrm.Show();
        }
 
        private void Splash_FormClosing(object sender, FormClosingEventArgs e)
        {
            e.Cancel = true;
        }
 
        void ThreadWorker()
        {
            Thread.Sleep(3000);
            state.Invoke(new Action(() => { state.Text = "Вход в систему..."; } ));
            if (string.IsNullOrEmpty(Usable.Settings.Login) || string.IsNullOrEmpty(Usable.Settings.Password))
            {
                var _dlg = new Login().ShowDialog();
                switch (_dlg)
                {
                    case DialogResult.OK:
                        Worker.Login(Usable.Settings.Login, Usable.Settings.Password);
                        break;
                    default:
                        //Close();
                        Environment.Exit(1);
                        break;
                }
            }
            else
                Worker.Login(Usable.Settings.Login, Usable.Settings.Password);
            if (Usable.LoginedUser != null)
            {
                state.Invoke(new Action(() => { state.Text += " " + Usable.LoginedUser.Username + " Успешно!"; }));
                Thread.Sleep(2000);
            }
            else if (Usable.LoginedUser == null)
            {
                //Close();
                Environment.Exit(1);
            }
 
            state.Invoke(new Action(() => { state.Text = "Получаем данные о пользователе..."; }));
            progressBar1.Invoke(new Action(() => { progressBar1.Style = ProgressBarStyle.Continuous; progressBar1.Maximum = 2; }));
            System.Net.WebClient _wbc = new System.Net.WebClient();
            Usable.Avatar = _wbc.DownloadData(Usable.LoginedUser.AvatarUrl.Replace(".gif", ".png"));
            progressBar1.Invoke(new Action(() => { progressBar1.Value++; }));
            Usable.UserPastes = Usable.LoginedUser.GetPastes(1000);
            progressBar1.Invoke(new Action(() => { progressBar1.Value++; }));
            progressBar1.Invoke(new Action(() => { progressBar1.Style = ProgressBarStyle.Marquee; }));
            state.Invoke(new Action(() => { state.Text = "Открываем приложение..."; }));
            Thread.Sleep(3000);
            Invoke(new Action(() => { Close(); }));
        }
up!

Решение задачи: «.NET 4.x Как перейти к основному потоку из фонового»

textual
Листинг программы
public Splash()
        {            
            InitializeComponent();
            ThreadWorker();
        }
 
        async void ThreadWorker()
        {               
            await Task.Run(
                ()=>
                {
                    Thread.Sleep(30000);
                    //Тут выполняется что-то долгое
                    //И основная форма не висит
                }
                );
 
            //Тут делаем что-то с результатом
            //Форму тут можно создать по результатам работы           
 
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5
Похожие ответы