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