【问题标题】:how to return method which has task<t> return type如何返回具有 task<t> 返回类型的方法
【发布时间】:2014-08-14 01:20:33
【问题描述】:
public override Task<IdentityResult> ValidateAsync(AppUser item)
        {
            if(item.Email != "a@a.com")
            {
                IEnumerable<string> errors = new List<string>() { "error1" };

            }           
        }

IdentityResult 的构造函数中只需要一个简单的数组或可枚举的字符串。

正确的语法是什么?

【问题讨论】:

    标签: c# asynchronous


    【解决方案1】:

    您可以使用Task.Run() 开始并获取对新Task 的引用:

    public IdentityResult Validate( AppUser item )
    {
         IdentityResult result; 
    
         // do stuff
    
         return result;
    }
    
    public override Task<IdentityResult> ValidateAsync( AppUser item )
    {
        return Task.Run( () => Validate(item) );
    }
    

    【讨论】:

      【解决方案2】:

      如果您绝对需要 ValidateAsync() 而不仅仅是 Validate(),请使用 TaskCompletionSource 进行模拟。

      public override Task<IdentityResult> ValidateAsync(AppUser item)
      {
          var result = new IdentityResult();
          var tcs = new TaskCompletionSource<IdentityResult>();
      
          if(item.Email != "a@a.com")
          {
              IEnumerable<string> errors = new List<string>() { "error1" };
              result.Add(errors)
          }   
          tcs.SetResult(result);        
          return tcs.Task;
      }
      

      Using Task.Run creates unnecessary overhead.

      编辑:我不确定 TaskCompletionSource 是否比 Task.Run 更好。我很想听听答案。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      • 2016-10-05
      • 1970-01-01
      • 1970-01-01
      • 2015-01-01
      相关资源
      最近更新 更多