.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);
- //Тут выполняется что-то долгое
- //И основная форма не висит
- }
- );
- //Тут делаем что-то с результатом
- //Форму тут можно создать по результатам работы
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д