簡體   English   中英

執行后進度條線程不會中止,應用程序崩潰-WPF

[英]Progressbar Thread doesn't abort after execution, application crashing -WPF

當用戶嘗試登錄系統時,我試圖顯示進度欄。 都靈的操作我正在向用戶顯示進度欄窗口。 我使用背景工作人員完成了此工作, 但是有時系統崩潰。 看來Windows 8造成了問題。 因為它在Windows 7中運行沒有任何錯誤,這是我的loadingview.xaml.cs代碼,其中包含與進度欄相關的代碼

public partial class LoadingViewControl : Window
{
    System.ComponentModel.BackgroundWorker mWorker;

    public LoadingViewControl()
    {
        InitializeComponent();
        Load();
    }

    public LoadingViewControl(bool Close)
    {
        this.Close();
    }
    public void Load()
    {
        mWorker = new System.ComponentModel.BackgroundWorker();
        mWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(worker_DoWork);
        mWorker.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(worker_ProgressChanged);
        mWorker.WorkerReportsProgress = true;
        mWorker.WorkerSupportsCancellation = true;
        mWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
        mWorker.RunWorkerAsync();

        while (pbProcessing.Value < 99)
        {
            if (!mWorker.CancellationPending)
            {
                try
                {
                    if (pbProcessing.Value > 95)
                    {
                        mWorker.CancelAsync();
                        //Uri uri = new Uri("/View/LoginchildView.xaml", UriKind.Relative);
                        break;
                    }
                    else
                    {
                    pbProcessing.Value = (pbProcessing.Value + 0.005) % 100;
                    }
                }
                catch (System.Exception ex)
                {
                    // No action required
                }
            }
            else
            {
                break;
            }

            System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Background,
                                   new System.Threading.ThreadStart(delegate { }));
        }           
    }


    private void worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
    {
        // Do your work here, its on seperate thread          
    }

    private void worker_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
    {
        pbProcessing.Value = e.ProgressPercentage;
    }

    private void worker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
    {
        // Stop Progressbar updatation             
    }

    private void LoadingViewControl_Load(object sender, EventArgs e)
    {
        SetFocus();
    }

    public void SetFocus()
    {
        this.Focus();
        this.Activate();
    }
} 

現在,我向您展示實現進度條的我的Loginviewform.xaml.cs代碼。

        if (txtUserName.Text != "")
        {
            if (txtPassword.Password != "")
            {

                if (STAThread == null)
                {
                    STAThread = new Thread(() => { new LoadingViewControl().ShowDialog(); });
                    STAThread.SetApartmentState(ApartmentState.STA);
                    STAThread.IsBackground = true;
                    STAThread.Start();
                }
                else
                {
                    STAThread.SetApartmentState(ApartmentState.STA);
                    STAThread.IsBackground = true;
                    STAThread.Start();
                }

                result = User.Instance.Authenticicate(txtUserName.Text, txtPassword.Password);
                if (result == true)
                {

                    pbProcessing.Value = 100;
                    ServiceLocator.Current.GetInstance<ContainerViewModel>().ExecuteLobbyBasicViewCommand();

                    //redirect on specific page.
                    if (STAThread.IsAlive)
                    {
                        Thread.CurrentThread.Interrupt();
                        STAThread.Interrupt();
                        STAThread.Abort();
                        STAThread = null;
                    }
                    PopUp objpopup = new PopUp();
                    objpopup.txtNotice.Text = "sign in";
                    objpopup.txtMessage.Text = "successfully sign in.";
                    objpopup.ShowDialog();
                    Global.GetUserName = txtUserName.Text;
                }
                else
                {
                    //MessageBox.Show("Sign In was unsuccessful. Please correct the errors and try again.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);

                    STAThread.Abort();
                    STAThread = null;
                    PopUp objPopUp = new PopUp();
                    objPopUp.txtNotice.Text = "Error";
                    objPopUp.txtMessage.Text = "Sign In was unsuccessful. Please correct the errors and try again.";
                    objPopUp.ShowDialog();
                    txtUserName.Focus();
                    //pbProcessing.Value = 0;
                    stackpanelLoading.Visibility = System.Windows.Visibility.Hidden;
                }
            }
            else
            {
                //MessageBox.Show("Please enter the valid Password.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                PopUp objPopUp = new PopUp();
                objPopUp.txtNotice.Text = "Error";
                objPopUp.txtMessage.Text = "Please enter the valid Password.";
                objPopUp.ShowDialog();
                txtPassword.Focus();
                stackpanelLoading.Visibility = System.Windows.Visibility.Hidden;
            }
        }
        else
        {
            //MessageBox.Show("Please enter the valid Player ID.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
            PopUp objPopUp = new PopUp();
            objPopUp.txtNotice.Text = "Error";
            objPopUp.txtMessage.Text = "Please enter the valid Player ID.";
            objPopUp.ShowDialog();
            txtUserName.Focus();
            stackpanelLoading.Visibility = System.Windows.Visibility.Hidden;
        }

知道出了什么問題嗎? 任何幫助將不勝感激。謝謝

這是非常奇怪的代碼。 嘗試像這樣重構它:

public partial class LoadingViewControl : Window
{
    public LoadingViewControl(string userName, string password)
    {
        InitializeComponent();
        Initialize(userName, password);
    }

    private void Initialize(string userName, string password)
    {
        pbProcessing.IsIndeterminate = true;
        var thread = new Thread(() =>
                                    {
                                        DialogResult = User.Instance.Authenticicate(userName, password);
                                        Close();
                                    });
        thread.IsBackground = true;
        thread.Start();
    }
}

和一些方法:

public void Do()
        {
            if (string.IsNullOrEmpty(txtUserName.Text))
            {
                if (string.IsNullOrEmpty(txtPassword.Password))
                {
                    var view = new LoadingViewControl(txtUserName.Text, txtPassword.Password);
                    result = view.ShowDialog();
                    if (result == true)
                    {
                        ServiceLocator.Current.GetInstance<ContainerViewModel>().ExecuteLobbyBasicViewCommand();
                        PopUp objpopup = new PopUp();
                        objpopup.txtNotice.Text = "sign in";
                        objpopup.txtMessage.Text = "successfully sign in.";
                        objpopup.ShowDialog();
                        Global.GetUserName = txtUserName.Text;
                    }
                    else
                    {
                        //MessageBox.Show("Sign In was unsuccessful. Please correct the errors and try again.", "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                        PopUp objPopUp = new PopUp();
                        objPopUp.txtNotice.Text = "Error";
                        objPopUp.txtMessage.Text = "Sign In was unsuccessful. Please correct the errors and try again.";
                        objPopUp.ShowDialog();
                        txtUserName.Focus();
                        stackpanelLoading.Visibility = Visibility.Hidden;
                    }
                }
                else
                {
                    PopUp objPopUp = new PopUp();
                    objPopUp.txtNotice.Text = "Error";
                    objPopUp.txtMessage.Text = "Please enter the valid Password.";
                    objPopUp.ShowDialog();
                    txtPassword.Focus();
                    stackpanelLoading.Visibility = Visibility.Hidden;
                }
            }
            else
            {
                PopUp objPopUp = new PopUp();
                objPopUp.txtNotice.Text = "Error";
                objPopUp.txtMessage.Text = "Please enter the valid Player ID.";
                objPopUp.ShowDialog();
                txtUserName.Focus();
                stackpanelLoading.Visibility = Visibility.Hidden;
            }
        }

這種方法看起來很丑,您必須對其進行重構。 但我只想展示主要思想

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM