使用async/await将现有的C#同步方法转换为异步方法?

使用async/await将现有的C#同步方法转换为异步方法?,c#,.net,asynchronous,async-await,C#,.net,Asynchronous,Async Await,从同步I/O绑定方法开始(如下),如何使用async/await使其异步 public int Iobound(SqlConnection conn, SqlTransaction tran) { // this stored procedure takes a few seconds to complete SqlCommand cmd = new SqlCommand("MyIoboundStoredProc", conn, tran); cmd.CommandTyp

从同步I/O绑定方法开始(如下),如何使用async/await使其异步

public int Iobound(SqlConnection conn, SqlTransaction tran)
{
    // this stored procedure takes a few seconds to complete
    SqlCommand cmd = new SqlCommand("MyIoboundStoredProc", conn, tran);
    cmd.CommandType = CommandType.StoredProcedure;

    SqlParameter returnValue = cmd.Parameters.Add("ReturnValue", SqlDbType.Int);
    returnValue.Direction = ParameterDirection.ReturnValue;
    cmd.ExecuteNonQuery();

    return (int)returnValue.Value;
}
MSDN示例都假定存在一个*异步方法,并且没有为自己创建一个用于I/O绑定操作的异步方法提供指导

我可以在新任务中使用Task.Run()并执行Iobound(),但不鼓励创建新任务,因为该操作不受CPU限制


我想使用async/await,但我被困在这个基本问题上,即如何继续转换此方法。

此特定方法的转换非常简单:

// change return type to Task<int>
public async Task<int> Iobound(SqlConnection conn, SqlTransaction tran) 
{
    // this stored procedure takes a few seconds to complete
    using (SqlCommand cmd = new SqlCommand("MyIoboundStoredProc", conn, tran)) 
    {
        cmd.CommandType = CommandType.StoredProcedure;
        SqlParameter returnValue = cmd.Parameters.Add("ReturnValue", SqlDbType.Int);
        returnValue.Direction = ParameterDirection.ReturnValue;
        // use async IO method and await it
        await cmd.ExecuteNonQueryAsync();
        return (int) returnValue.Value;
    }
}
//将返回类型更改为任务
公共异步任务IOBOND(SqlConnection conn、SqlTransaction tran)
{
//此存储过程需要几秒钟才能完成
使用(SqlCommand cmd=newsqlcommand(“MyIoboundStoredProc”,conn,tran))
{
cmd.CommandType=CommandType.storedProcess;
SqlParameter returnValue=cmd.Parameters.Add(“returnValue”,SqlDbType.Int);
returnValue.Direction=参数Direction.returnValue;
//使用异步IO方法并等待它
wait cmd.ExecuteNonQueryAsync();
return(int)returnValue.Value;
}
}

为什么不直接使用
ExecuteNonQueryAsync()
?请在您的SqlCommand上使用
using
…做一个google搜索,实际上有很多示例介绍如何将您的方法修饰为等待和使用Task@CamiloTerevinto我可以问你为什么不停地编辑我答案的格式吗?
{
(是否在新行中)的位置是个人偏好,更改它不会增加任何值。@Evk如果能够阅读和必须阅读之间存在差异,则这不是个人偏好scroll@MikeZ那么您通常不需要将此方法设置为异步。异步是用于异步IO的(正如您所知道的),现在所有IO都有异步版本(文件、套接字、数据库、web请求等)。如果您有反例,请提供一个。谢谢!但我应该选择一个不同的示例。在本例中,有一个预先存在的*异步方法ExecuteNonQueryAsync(),假定I/O绑定调用的主体不同,并且没有预先存在的*Async方法。如果不在Task.Run()中包装同步代码,如何将Iobound()转换为IoboundAsync(),这不建议用于I/O绑定代码?@MikeZ我已经回答了上面的问题。请提供一个没有异步版本的此类IO的示例。如果您指的是您编写的其他同步IO方法,则应首先将其转换为异步。因此,异步应该一直保持下去。“现在所有IO都有异步版本”嗯。我不知道。也许这就是我缺少的部分。@MikeZ您需要生成异步客户端代码。即使WCF服务在服务器上是同步的-客户端也可以选择异步调用它(在客户端)。请参阅此处:。因此,您的目标是创建/生成通道。MethodAsync(),当然不需要任何任务。运行