2016-08-04 16 views
0

私のロジックでは分かりませんが、私は期待はしませんが、アプリケーションがロックアップします。UWP Wcfサービスコールasyncが2回呼び出されたときに失敗する

コード:

ChatClient Service = new ChatClient(); 
    public MainPage() 
    { 
     this.InitializeComponent(); 
    } 

    private void button_Click(object sender, RoutedEventArgs e) 
    { 
     var temp = Service.AuthenicateAsync(T1.Text, T2.Text).Result; 
    } 

ChatClientコード:

public User Authenicate(string username, string password) 
    { 
     Clock.Restart(); 

     var User = new User(); 
     var Valid = false; 

     try 
     { 

      var VerificationQuery = Provider.CreateAdoCommand("select count(AccessToken) as 'Verified' from Users where [email protected] and [email protected];", Provider.CreateParameter("@user", DbType.String), Provider.CreateParameter("@pass", DbType.String)); 
      var reader1 = VerificationQuery.ExecuteReader(username, password); 
      using (reader1.Open()) 
      {//Check to see if the username and password is valid 
       while (reader1.MoveNext()) 
       { 
        if (reader1.GetInt32("Verified").Value == 1) 
        { 
         Valid = true; 
        } 
       } 
      } 

      if (Valid) 
      { 
       var TokenQuery = Provider.CreateAdoCommand("select AccessToken, Timeout from Users where [email protected] and [email protected]", Provider.CreateParameter("@user", DbType.String), Provider.CreateParameter("@pass", DbType.String)); 
       var reader2 = TokenQuery.ExecuteReader(username, password); 
       using (reader2.Open()) 
       {//If the username and password is valid, retrieve the token and timeout period 
        while (reader2.MoveNext()) 
        { 
         User.AccessToken = reader2.GetString("AccessToken"); 
         User.TimeoutPeriod = reader2.GetDateTime("Timeout").Value; 
        } 
       } 

       //Check to see how old the timeout period is 
       var timeSub = User.TimeoutPeriod.Subtract(DateTime.Now); 
       if (timeSub.Days < 2) 
       { 
        //The token is too old, update the token, old token and timeout period 
        var TokenUpdateQuery = Provider.CreateAdoCommand("update Users set AccessToken=(NEWID()), [email protected], [email protected]", Provider.CreateParameter("@oldToken", DbType.String), Provider.CreateParameter("@newTime", DbType.Date)); 
        using (TokenUpdateQuery.Open()) 
        { 
         TokenUpdateQuery.ExecuteNonQuery(User.AccessToken, DateTime.Now.AddDays(30)); 
        } 

        var FinalQuery = Provider.CreateAdoCommand("select AccessToken, Timeout from Users where [email protected] and [email protected]", Provider.CreateParameter("@user", DbType.String), Provider.CreateParameter("@pass", DbType.String)); 
        var reader3 = FinalQuery.ExecuteReader(username, password); 
        using (reader3.Open()) 
        { 
         while (reader3.MoveNext()) 
         { 
          User.AccessToken = reader3.GetString("AccessToken"); 
          User.TimeoutPeriod = reader3.GetDateTime("Timeout").Value; 
         } 
        } 
       } 

       //Database Query for user information 
       var UserQuery = Provider.CreateAdoCommand("select FirstName, LastName, Email, DateCreated, AccessToken, OldAccessToken, Timeout, ConnectionId from [Users] where [email protected];", Provider.CreateParameter("@token", DbType.String)); 
       var reader4 = UserQuery.ExecuteReader(User.AccessToken); 

       using (reader4.Open()) 
       { 
        while (reader4.MoveNext()) 
        { 
         if (reader4.GetString("AccessToken").Equals(User.AccessToken)) 
         { 
          User.FirstName = reader4.GetString("FirstName"); 
          User.LastName = reader4.GetString("LastName"); 
          User.Email = reader4.GetString("Email"); 
          User.AccessToken = reader4.GetString("AccessToken"); 
          User.OldAccessToken = reader4.GetString("OldAccessToken"); 
          User.TimeoutPeriod = reader4.GetDateTime("Timeout").Value; 
          User.DateCreated = reader4.GetDateTime("DateCreated").Value; 
          User.ConnectionId = reader4.GetString("ConnectionId"); 
         } 
        } 
       } 
      } 
     } 
     catch (Exception) 
     { 

     } 

     Clock.Stop(); 
     User.SecondsProcessed = Clock.Elapsed.TotalSeconds; 
     return User; 

    } 

サービスは、Visual Studioを使用して追加された私のWebサーバー上でホストされたWCFサービスです。私のアプリケーションの中には、2つのテキストボックスとボタンがあります。そのボタンをクリックすると、このメソッドが起動します。初めてそれは動作します。それを2回目にクリックし、ブレークポイントに続いてvar temp ...とヒットしますが、その後ただ落ちてしまい、アプリケーションがロックアップします。

+0

サービスコードはどうですか? – EJoshuaS

+0

それが確かに役立つならば、まともなサイズのコードです。 –

+0

サービスで何が起こったのかに関するログがありますか? – EJoshuaS

答えて

0

私は本当に説明できません。しかし、このように見えるようにメソッドを変更すると動作します。 Asyncメソッドが呼び出されているので、データを取得するためにそれを待つ必要があるので、私はできます。そのため、非同期キーワードをメソッドに追加する必要があります。

private async void button_Click(object sender, RoutedEventArgs e) 
    { 
     var temp = await Service.AuthenicateAsync("", ""); 
    } 
関連する問題