有没有办法在异步方法中使用out参数。?如果没有,任何人都可以建议我如何从异步方法返回OUT参数?

时间:2015-02-17 19:26:34

标签: c# .net task-parallel-library async-await asp.net-web-api2

我使用以下方法:

public async Task<SaveStatus> Save(Foo foo,out int param)
{
    .......
    MySqlParameter prmparamID = new MySqlParameter("pParamID", MySqlDbType.Int32);
        prmparamID .Direction = ParameterDirection.Output;
        sqlCommand.Parameters.Add(prmparamID); 
    try
        {
            await sqlConnection.OpenAsync();
            await sqlCommand.ExecuteNonQueryAsync();

            status = (SaveStatus)Convert.ToInt32(prmReturnValue.Value);

            if (status == SaveStatus.Success)
            {
                if (Common.IsDBValueNotNullOrEmpty(prmParamID))
                {
                    param= Convert.ToInt32(prmParamID.Value);
                }
            }
        }      

    return status;
}

我想返回状态和整数参数。任何人都可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:10)

out方法中不能包含async参数。以下是有关原因的更多信息:Why async methods cannot have ref or out parameters?

如果要返回多个返回值,则可能应该有一个包含这些值的类并将其返回。

如果您不想创建新课程,可以使用Tuple

public async Task<Tuple<SaveStatus, int>> Save(Foo foo)
{
    SaveStatus status;
    int param;

    // ... 

    return Tuple.Create(status, param);
}

答案 1 :(得分:0)

快速回答是&#34;因为人们会尝试使用它&#34;。

从技术上讲,方法可以包含refout个参数,但它们的值只能在第一个await之前设置。因为,在此之后,它不再是调用者调用的方法,而是一些编译器生成的状态机代码运行。