如何返回有任务<t>返回类型</t>的方法

时间:2014-06-23 22:15:28

标签: c# asynchronous

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

            }           
        }

IdentityResultjust在其构造函数中需要一个简单的数组或不可相关的字符串。

什么是正确的语法?

2 个答案:

答案 0 :(得分:1)

如果您绝对需要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更好。我很乐意听到答案。

答案 1 :(得分:-2)

您可以使用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) );
}