Multithreadin асинхронных &амп backgroundworker; ждут входа на сервер SQL на C# в WPF
Всем привет,
У меня есть приложение C# WPF с базой данных пользователей. У меня есть это, чтобы пользователь с правильной информацией мог войти в систему, и в зависимости от того, является ли он администратором или клиентом, он приведет их в соответствующее меню. Теперь я хочу иметь загрузочный файл .gif, пока программа проверяет базу данных на наличие информации о пользователях. Я думал, что мне следует использовать многопоточность, но, изучая ее, возможно, мне следует использовать backgroundworker или async и await. Я не уверен, какой из них мне следует использовать. Я попробовал свой код с backgroundworker я переместил свой код входа в метод "Dowork", но когда я запускаю программу, она говорит, что мои элементы управления находятся не в правильном потоке.
Любые способы заставить этот gif работать будут оценены по достоинству, вот что у меня есть.
public partial class LoginScreen : Window { private User loginUser = new User(); BackgroundWorker backgroundWorker = null; public LoginScreen() { InitializeComponent(); txtUsername.Text = "Username"; txtPassword.Password = "Password"; InstantiateBackgroundWorker(); } private void BtnLoginUser_Click(object sender, RoutedEventArgs e) { string username = txtUsername.Text; string password = txtPassword.Password; if (string.IsNullOrEmpty(txtUsername.Text)) { //verify and enter username. MessageBox.Show("Enter your username.", "Empty", MessageBoxButton.OK, MessageBoxImage.Information); txtUsername.Focus(); return; } else if (string.IsNullOrEmpty(txtPassword.Password)) { MessageBox.Show("Enter your password.", "Empty", MessageBoxButton.OK, MessageBoxImage.Information); txtPassword.Focus(); return; } else { // Start loading Gif LoadSpinner.Visibility = Visibility.Visible; // Disable login and register button. BtnLoginUser.IsEnabled = false; BtnCreateUser.IsEnabled = false; // Start the background worker. backgroundWorker.RunWorkerAsync(); //try //{ // loginUser = SQLuserAccess.UserLogin(txtUsername.Text, txtPassword.Password.ToString()); // if (loginUser != null) // { // if (txtUsername.Text == loginUser.Username && txtPassword.Password == loginUser.Password) // { // if (loginUser.IsAdmin == true) // { // Window showAdminSrc = new AdminWindow(loginUser); // showAdminSrc.Show(); // Close(); // } // else if (loginUser.IsAdmin == false) // { // Window nonAdmin = new CustomerScreen(loginUser); // nonAdmin.Show(); // Close(); // } // else // lblInvalidText.Content = "Admin is not True or False!"; // } // else // { // lblInvalidText.Visibility = Visibility.Visible; // } // } // else // lblInvalidText.Visibility = Visibility.Visible; //} //catch(Exception ex) //{ // //lblInvalidText.Visibility = Visibility.Visible; // MessageBox.Show(ex.Message.ToString()); //} } } private void InstantiateBackgroundWorker() { backgroundWorker = new BackgroundWorker(); backgroundWorker.ProgressChanged += BackgroundWorker_ProgressChanged; backgroundWorker.DoWork += BackgroundWorker_DoWork; backgroundWorker.RunWorkerCompleted += BackgroundWorker_RunWorkerCompleted; backgroundWorker.WorkerReportsProgress = true; } private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { //Stop the loading //throw new NotImplementedException(); LoadSpinner.Visibility = Visibility.Hidden; } private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e) { // ?? Start the loading ?? //throw new NotImplementedException(); string username = txtUsername.Text; string password = txtPassword.Password; try { loginUser = SQLuserAccess.UserLogin(username, password); if (loginUser != null) { if (username == loginUser.Username && password == loginUser.Password) { if (loginUser.IsAdmin) { Window WindowAdminMenu = new AdminWindow(loginUser); WindowAdminMenu.Show(); Close(); } else if (loginUser.IsCustomer) { Window WindowCustomerMenu = new CustomerScreen(loginUser); WindowCustomerMenu.Show(); Close(); } else lblInvalidText.Content = "Invalid Account Information"; } else lblInvalidText.Visibility = Visibility.Visible; } else lblInvalidText.Visibility = Visibility.Visible; } catch(Exception ex) { MessageBox.Show(ex.Message.ToString()); } } private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) { LblWatch.Content = e.UserState.ToString(); } private void LoadSpinner_MediaEnded(object sender, RoutedEventArgs e) { LoadSpinner.Position = new TimeSpan(0, 0, 1); LoadSpinner.Play(); }
Что я уже пробовал:
фоном рабочего метода dowork прогресс N завершено говорит, что из другого потока