TheBigBearNow Ответов: 1

В C# backgroundworker в WPF многопоточность загрузки ..рисунок в качестве логина


До сих пор мне не везло с загрузкой gif-изображения, когда я загружаю/проверяю подключение к базе данных, я нажимаю кнопку входа в систему и не получаю ошибок в своем логине, я запускаю свой gif, но я также запускаю его в разделе dowork и progress im не уверен, какой раздел на самом деле правильный, я знаю, что не нужно связываться с пользовательским интерфейсом в dowork
Моя программа работает, но мой .gif не запускается, и через некоторое время появляется правильный экран! Так что я знаю, что я очень близок, просто мой gif должен выскочить, и это все.
Мой gif находится в <mediaelement>
private void BtnLoginUser_Click(object sender, RoutedEventArgs e)
        {       // Start loading Gif
                LoadSpinner.Visibility = Visibility.Visible;

                // Disable login and make create button a cancel.
                BtnLoginUser.IsEnabled = false;
                BtnCreateUser.Content = "Cancel";

                // Start the background worker.
                backgroundWorker.RunWorkerAsync();
 }
private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            // ?? Start the loading ??
            //throw new NotImplementedException();
           // backgroundWorker.ReportProgress((int)e.Argument);
            try
            {
                loginUser = SQLuserAccess.UserLogin(username, password);
                if (loginUser != null)
                {
                    if (username == loginUser.Username && password == loginUser.Password)
                    {
                        
                    }
                }
            }
            catch(Exception ex) { MessageBox.Show(ex.Message.ToString()); }
  }
        private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            LblWatch.Content = "Processing " + e.UserState.ToString() + " : " + e.ProgressPercentage;

//maybe here is where i run the loading.gif?? ??    free to interact with UI in progressChanged.

            LoadSpinner.Visibility = Visibility.Visible;
}
private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            //Stop the loading  RUNS when thread is COMPLETED can work on UI
            //throw new NotImplementedException();
            BtnCreateUser.Content = "Register";
            LoadSpinner.Visibility = Visibility.Hidden;

            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";
}
        private void LoadSpinner_MediaEnded(object sender, RoutedEventArgs e)
        {
            LoadSpinner.Position = new TimeSpan(0, 0, 1);
            LoadSpinner.Play();
}


Что я уже пробовал:

Я получил это работает без каких-либо ошибок, единственное, что по какой-то причине мой .gif не выскакивает, так что мой загрузочный образ не работает, пока загружается раздел входа в систему

1 Ответов

Рейтинг:
2

Gerry Schmitz

Да; вы отображаете (новый) .gif в обработчике "ProgressChanged" (потому что он работает в потоке пользовательского интерфейса вызывающего пользователя по сравнению с DoWork, который "является" фоновым рабочим потоком).

И вы должны вызвать "ReportProgress" (чтобы вызвать ProgressChanged) из DoWork; он не запускается сам по себе.


TheBigBearNow

Как вызвать отчет о прогрессе из dowork()?

Application.Current.Dispatcher.Invoke(delegate
17
    {
18
        backgroundWorker.ReportProgress(); //but what do i pass in and not sure if this is it
19
    });

Richard Deeming

Вам не нужно завершать этот звонок Invoke - ReportProgress автоматически позаботится об этом за вас.

Значение, которое вы передадите, будет представлять собой число, представляющее прогресс, и, возможно, объект по вашему собственному выбору. Затем вы можете получить доступ к этим значениям в ProgressChanged обработчик событий.

NB: e.UserState может быть null, так что ваш текущий код будет выбрасывать NullReferenceException когда ты позвонишь e.UserState.ToString() Это достаточно легко исправить:

LblWatch.Content = "Processing " + e.UserState + " : " + e.ProgressPercentage;
// Or:
LblWatch.Content = string.Format("Processing {0} : {1}", e.UserState, e.ProgressPercentage);
// Or:
LblWatch.Content = $"Processing {e.UserState} : {e.ProgressPercentage}";