2016-10-06 36 views
-1

因此,我目前正在用.NET構建Web Api,並使用實體框架使用異步調用。異步調用與C#只能一步一步調試

在我PUT端點控制器,我試圖讓用戶是否已屬於另一個級別,或者如果他在DB的所有,這裏的控制器代碼:

[HttpPut] 
    public async Task<IHttpActionResult> PutCommittee(CommitteeViewModel committee) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     if (!User.IsInRole("Dean") && !User.IsInRole("Chair")) 
      return Unauthorized(); 


     var user = await db.Users.Where(u => u.Cn == User.Identity.Name).FirstOrDefaultAsync(); 
     if (user == null) { return BadRequest("Your user does not exist"); } 
     if (User.IsInRole("Dean")) 
     { 
      var college = await db.Colleges.Where(c => c.Dean.Cn == user.Cn).FirstOrDefaultAsync(); 
      if (college == null) { return BadRequest("You're not a Dean of any college"); } 
      committee.Name = _utils.getCollegeCommitteeName(college); 

     } 
     else 
     { 
      var department = await db.Departments.Where(d => d.Chair.Cn == user.Cn).FirstOrDefaultAsync(); 
      if (department == null) { return BadRequest("You're not a Chair of any college"); } 
      committee.Name = _utils.getDepartmentCommitteeName(department); 
     } 

     var model = await db.Commitees.Where(c => c.Name == committee.Name).FirstOrDefaultAsync(); 
     if (model == null) 
      return BadRequest("You have no committee"); 

     var tuple = await getUsers(committee); 
     model.Users = tuple.Item1; 
     if (model.Users == null) 
      return BadRequest(tuple.Item2); 

     db.Entry(model).State = EntityState.Modified; 

     try 
     { 
      await db.SaveChangesAsync(); 
     } 
     catch (DbUpdateConcurrencyException) 
     { 
      throw; 
     } 

     return StatusCode(HttpStatusCode.NoContent); 
    } 

和這裏的檢查用戶的功能:

 private async Task<Tuple<List<User>, string>> getUsers(CommitteeViewModel committee) 
    { 
     string error = ""; 
     List<User> users = new List<User>(); 
     var tuple = new Tuple<List<User>, string>(users, error); 
     var role = await db.Roles.Where(r => r.Name == "Committee").FirstOrDefaultAsync(); 
     foreach (UserViewModel u in committee.Users) 
     { 
      var user = await db.Users.Where(us => us.Cn == u.Cn).FirstOrDefaultAsync(); 


      if (user != null) 
      { 
       if (user.Role.Name == "Chair" || user.Role.Name == "Dean") 
       { 
        error = "User " + user.Name + " is a " + user.Role.Name + " and cannot be member of a review committee"; 
        return tuple; 
       } 

       users.Add(user); 
      } 
      else 
      { 
       user = _loginProvider.generateUser(u.Cn, role); 
       db.Users.Add(user); 
       await db.SaveChangesAsync(); 
       users.Add(user); 
      } 
     } 



     return tuple; 
    } 

我使用了一個元組,因爲async方法不支持OUT參數,萬一出現錯誤。

所以問題是,當我刪除一個用戶在我的前端(然後發送一個放置請求與更新的數組),我調試一步一步,它確實刪除它,但當我不如果我在try塊中放置斷點,則變量model.Users包含前一個數組(來自模型的原始數組),並且這僅發生在從數組中刪除用戶時出現的情況,而奇怪的是它當我同時寫入代碼時也發生了

感謝您的幫助。

+1

我們無法調試您的代碼.....請縮小您的問題併發布較小的代碼... –

+0

如果發生這種情況的異步和同步,那麼它不是一個同步問題。你確定你是從用戶界面更新模型嗎? –

+0

是的,出現在調試過程中的ViewModel確實包含我想要的更改(刪除用戶)。對我來說似乎有點嫌疑的線是異步獲取委員會模型變量,因爲集合用戶重置爲以前所具有的,即使在調用getUsers()函數之後 –

回答

-1

只記得...異步方法運行的服務器,所以如果你有需要先運行的進程,你需要替換一個簡單的異步方法。嘗試一下,我確信你可以解決它。