2013-02-25 80 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