TheBigBearNow Ответов: 1

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 завершено говорит, что из другого потока

1 Ответов

Рейтинг:
10

TABiSH777

Привет, вы находитесь на правильном пути, вы можете легко использовать Backgroundworker для этой цели, просто помните, что во время работы с многопоточностью мы не можем получить доступ к элементам пользовательского интерфейса непосредственно из другого потока.
А поскольку весь код, выполняемый в Backgroundworker, находится в другом потоке, мы не можем получить к нему доступ или изменить его, поэтому, когда вы пишете свою логику в Backgroundworker, реализуйте логику таким образом, чтобы нам не нужно было использовать элементы пользовательского интерфейса, или, если это необходимо, вы можете получить к ним доступ раньше, то есть в вашем случае

Цитата:
строка username = txtUsername.Текст;
строковый пароль = txtPassword.Пароль;

сделайте имя пользователя и пароль глобальной переменной и назначьте значение перед этим
Цитата:
backgroundWorker.RunWorkerAsync();


или же при использовании таких
Цитата:
lblInvalidText.Content = "неверная информация об учетной записи";


вы должны сообщить диспетчеру (в основном вашему потоку пользовательского интерфейса), что вы меняете любой из этих элементов, поэтому вам нужно написать этот код в

Dispatcher.BeginInvoke(DispatcherPriority.Send,new Action(()=>{
//your logic
});


Для получения дополнительной информации о диспетчере вы можете проверить это ссылка