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