2014-09-06 95 views
1

我在更新用戶界面時遇到了問題,我不能爲我的生活弄清楚爲什麼,因爲我遵循在線示例。任何一個人都可以指向正確的方向嗎?wpf線程更新用戶界面

Private Sub btnLogIn_Click() 
    Dim u As String = tbxUser.Text 
    Dim p As String = tbxPassword.Password 

    Dim taskAuth = Tasks.Task(Of Boolean).Factory.StartNew(Function() auth_Login(u, p)) 
    taskAuth.Wait() 
    Dim is_user As Boolean = taskAuth.Result 

    If is_user = False Then 
     Dim shake As Storyboard = DirectCast(FindResource("Shake"), Storyboard) 
     shake.Begin() 
     tbxUser.Focus() 
    ElseIf is_user = True Then 
     If chbxRemember.IsChecked Then 
      My.Settings.name_User = u 
      My.Settings.Save() 
     Else 
      My.Settings.name_User = String.Empty 
      My.Settings.Save() 
     End If 

     Dim myFrame As Frame = myWindow.MainFrame 
     myFrame.Navigate(New mainMenu()) 
    End If 

End Sub 

Function auth_Login(u As String, p As String) 
    Dispatcher.BeginInvoke(Sub() myWindow.Cursor = Cursors.AppStarting) 
    Dispatcher.BeginInvoke(Sub() progBar.IsIndeterminate = True) 

    Dim is_user As Boolean = False 
    Try 
     Dim login As New COGENT_Model.Security_Model 
     is_user = login.check_user(u, p) 
    Catch 
     '99% db connection error 
     Dim myFrame As Frame = myWindow.MainFrame 
     Dispatcher.BeginInvoke(Sub() myFrame.Navigate(New mainConexion())) 
    End Try 
    Dispatcher.BeginInvoke(Sub() myWindow.Cursor = Cursors.Arrow) 
    Dispatcher.BeginInvoke(Sub() progBar.IsIndeterminate = False) 
    Return is_user 
End Function 

主要問題是在函數中,因爲我想知道用戶是否存在。雖然這是檢查,我想要一個進度欄運行。

回答

1

您正在屏蔽taskAuth.Wait()上的UI線程。

相反,你應該重構你的代碼是這樣的:

Private Sub btnLogIn_Click() 
    Dim u As String = tbxUser.Text 
    Dim p As String = tbxPassword.Password 

    Dim taskAuth = Tasks.Task(Of Boolean).Factory.StartNew(Function() auth_Login(u, p)) 
End Sub 

Function auth_Login(u As String, p As String) 
    Dispatcher.BeginInvoke(Sub() myWindow.Cursor = Cursors.AppStarting) 
    Dispatcher.BeginInvoke(Sub() progBar.IsIndeterminate = True) 

    Dim is_user As Boolean = False 
    Try 
     Dim login As New COGENT_Model.Security_Model 
     is_user = login.check_user(u, p) 
    Catch 
     '99% db connection error 
     Dim myFrame As Frame = myWindow.MainFrame 
     Dispatcher.BeginInvoke(Sub() myFrame.Navigate(New mainConexion())) 
    End Try 
    Dispatcher.BeginInvoke(Sub() myWindow.Cursor = Cursors.Arrow) 
    Dispatcher.BeginInvoke(Sub() progBar.IsIndeterminate = False) 

    Dispatcher.BeginInvoke(Sub() 
     If is_user = False Then 
      Dim shake As Storyboard = DirectCast(FindResource("Shake"), Storyboard) 
      shake.Begin() 
      tbxUser.Focus() 
     ElseIf is_user = True Then 
      If chbxRemember.IsChecked Then 
       My.Settings.name_User = u 
       My.Settings.Save() 
      Else 
       My.Settings.name_User = String.Empty 
       My.Settings.Save() 
      End If 

      Dim myFrame As Frame = myWindow.MainFrame 
      myFrame.Navigate(New mainMenu()) 
     End If 
    End Sub) 
    Return is_user 
End Function 

既不編譯,也不測試,但你的想法...

+1

原來如此!我有Wait()在那裏等待線程檢查用戶的存在。 – user3524375 2014-09-06 15:50:43