2013-02-25 113 views
2

我試圖在用戶嘗試登錄到系統時顯示進度條。 Durin操作我向用戶顯示進度條窗口。我使用backgroundworker做到了這一點,它工作。但有時系統崩潰。看來Windows 8正在創造這個問題。因爲它在運行Windows 7沒有任何error.Here是我loadingview.xaml.cs代碼包含進度相關的代碼進度條線程在執行後不中止,應用程序崩潰-WPF

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; 
     } 

任何想法是什麼問題?任何幫助將不勝感激。謝謝

+0

你的錯誤是什麼? – 2013-02-25 12:22:47

+0

它在運行時崩潰。在STAThread.Abort()中,實際上它不會中止,線程仍然活着。 – 2013-02-25 12:26:27

+0

你是否將它聲明爲後臺線程?所以當你關閉你的主線程時它會被處理掉。 – 2013-02-25 12:29:08

回答

0

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

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; 
      } 
     } 

這方法看起來醜陋,你必須重構它。但我只想顯示主要想法

+0

謝謝,但它不工作。 – 2013-03-22 04:21:19

相關問題