2015-02-24 33 views
0

我需要依次調用多個任務,並且任務的結果應該依賴於另一個開始。另外我們怎樣才能從任務方法中返回失敗的結果?由於我的任務方法在返回數據並基於其他條件時具有邏輯,所以它應該返回失敗的結果,並基於該方法不應執行下一個任務方法。依次調用線性順序的C#任務

這裏是我的控制器行動 -

 // 
     // POST: /Account/Register 
     [HttpPost] 
     [AllowAnonymous] 
     [ValidateAntiForgeryToken] 
     public async Task<ActionResult> Register(RegisterViewModel model) 
     { 
      if (ModelState.IsValid) 
      { 
       var user = new ApplicationUser 
       { 
        FacebookUserID = null, 
        UserName = model.Email, 
        Name = model.Name, 
        Password = model.Password, 
        LastFailedAttempt = null, 
        FailedAttempts = 0, 
        Status = model.Status, 
        UserType = model.UserType, 
        SourceType = model.SourceType, 
        DateCreated = DateTime.Now, 
        DateModified = null, 
        DateConfirmed = null, 
        Email = model.Email 
       }; 

       var result = await UserManager.CreateAsync(user, model.Password); 
       if (result.Succeeded) 
       { 
        user = await _userService.FindByNameAsync(model.Email); 
        await SignInAsync(user, false); 
        return RedirectToAction("Index", "Home"); 
       } 
       AddErrors(result); 
      } 
      return View(model); 
     } 

及以下的方法 - 服務

 /// <summary> 
     /// Checks and Creates the new Application User 
     /// </summary> 
     Task IUserStore<T, int>.CreateAsync(T model) 
     { 
      Task taskInvoke = Task.Factory.StartNew(() => 
      { 
       var appUser = GetUserByEmail(model.Email); 
       if (appUser == null) 
       { 
        User user = new User(); 
        user.FacebookUserID = model.FacebookUserID; 
        user.Name = model.Name; 
        user.Email = model.Email; 
        user.Password = model.Password; 
        user.LastFailedAttempt = null; 
        user.FailedAttempts = 0; 
        user.Status = model.Status; 
        user.UserType = model.UserType; 
        user.SourceType = model.SourceType; 
        user.DateCreated = DateTime.Now; 
        user.DateModified = null; 
        user.DateConfirmed = null; 

        _uow.UserRepository.Add(user); 
        _uow.Commit(); 
        return true; 
       } 
       else 
       { 
        return false; 
        //what should I return here if the user already exists? 
       } 
      }); 
      return taskInvoke; 
     } 

     /// <summary> 
     /// Finds and Returns the Application User by email 
     /// </summary> 
     Task<T> IUserStore<T, int>.FindByNameAsync(string email) 
     { 
      Task<T> taskInvoke = Task<T>.Factory.StartNew(() => 
      { 
       return (T)GetUserByEmail(email); 
      }); 
      return taskInvoke; 
     } 

     /// <summary> 
     /// Finds and returns the user by email 
     /// </summary> 
     public ApplicationUser GetUserByEmail(string email) 
     { 
      return Mapper.DynamicMap<ApplicationUser>(_uow.UserRepository.Get(x => x.Email == email)); 
     } 

我審查了該SO後,但沒能在我scenario-得到這個工作Run sequence of tasks, one after the other

+0

爲什麼你使用'tasks'呢? – 2015-02-24 04:31:50

+1

請比「無法得到這個工作」更具體。另一篇文章的答案似乎相關;爲什麼它不是你的情況? – 2015-02-24 04:31:58

+0

我已經爲ASP.Net EF Identity 2.0實現了簡單的自定義用戶存儲,並且需要覆蓋IUserStore,IUserPasswordStore和IUserSecurityStampStore接口的任務方法 – 2015-02-24 04:34:16

回答

-1

您可以使用ContinueWith來執行任務。這些可以鏈接。 https://msdn.microsoft.com/en-us/library/dd270696%28v=vs.110%29.aspx。例如:

class Program 
    { 
     static void Main(string[] args) 
     { 

      Task t1 = new Task(() => TaskOneWork()); 
      Task t2 = t1.ContinueWith((t) => TaskTwoWork()); 
      t1.Start(); 

      t2.Wait(); 
     } 

     private static void TaskOneWork() 
     { 
      for(int i = 0 ; i < 1000000; i++) 
      { } 
     } 

     private static void TaskTwoWork() 
     { 
      for (int i = 0; i < 1000000; i++) 
      { } 
     } 
    } 
+0

OP已經表明(以模糊不清的方式授予)「ContinueWith()」在他的場景中不起作用。請解釋一下,儘管如此,你的例子爲他的問題提供了一個答案。 – 2015-02-24 05:41:48