【问题标题】:Convert existing C# synchronous method to asynchronous with async/await?使用 async/await 将现有的 C# 同步方法转换为异步?
【发布时间】:2018-05-10 01:27:32
【问题描述】:

从同步 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 示例都假定 *Async 方法已经存在,并且没有为您自己制作一个用于 I/O 绑定操作的指南提供指导。

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

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

【问题讨论】:

  • 为什么不直接使用ExecuteNonQueryAsync()
  • 请在您的 SqlCommand 上使用 using...
  • google 搜索一下,其实有很多关于如何装饰你的方法是等待以及使用任务的例子
  • @CamiloTerevinto 我可以问你为什么你经常编辑我的答案的格式吗? { 的位置(是否换行)是个人喜好,更改它不会增加任何价值。
  • @Evk 如果能够阅读和必须滚动之间存在差异,这不是个人喜好

标签: c# .net asynchronous async-await


【解决方案1】:

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

// 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;
    }
}

【讨论】:

  • @MikeZ 那么你通常不需要使这个方法异步。 Async 用于异步 IO(您似乎知道),现在所有 IO 都有异步版本(文件、套接字、数据库、Web 请求等)。如果您有反例 - 请提供一个。
  • 谢谢!但我应该选择一个不同的例子。在这种情况下,有一个预先存在的 *Async 方法,ExecuteNonQueryAsync(),假定一个不同的主体,并且没有预先存在的 *Async 方法用于 I/O 绑定调用。如果不将同步代码包装在 Task.Run() 中,如何将 Iobound() 转换为 IoboundAsync(),对于 I/O 绑定代码不建议这样做?
  • @MikeZ 我已经在上面回答了。请提供一个没有异步版本的 IO 示例。如果您的意思是您编写的其他同步 IO 方法 - 您应该先将其转换为异步。所以 async 应该一直走下去。
  • “现在所有 IO 都有异步版本”嗯。我不知道。也许这就是我缺少的部分。
  • @MikeZ 您需要生成异步客户端代码。即使 WCF 服务在服务器上是同步的 - 客户端也可以选择异步调用它(在客户端)。见这里:docs.microsoft.com/en-us/dotnet/framework/wcf/…。所以你的目标是创建/生成 Channel.MethodAsync() 当然没有任何 Task.Run
猜你喜欢
  • 1970-01-01
  • 2017-05-13
  • 2019-01-17
  • 1970-01-01
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
  • 2021-04-12
  • 2013-09-19
相关资源
最近更新 更多