c# - 调用异步函数的不同方式

标签 c# .net asynchronous async-await task

我正在尝试创建一个可以异步写入 SQL 的日志记录类。我想我在 Logger 类中有实现。我的问题是我发现有两种方法可以调用异步函数,哪一种(如果有)是正确的方法或更明智的方法?

我有以下名为Logger的类:

public class Logger
 {
    public Logger() { }

    public async Task<int> RecordAsynchSQL(string sid, string lid, string action) 
    {
        using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["MyDB"].ConnectionString)) 
        {
            using (SqlCommand cmd = new SqlCommand("MyDB..audit_raw_save", conn)) 
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@sid", SqlDbType.VarChar, 50).Value = sid;
                cmd.Parameters.Add("@lob_id", SqlDbType.VarChar, 50).Value = lid;
                cmd.Parameters.Add("@action", SqlDbType.VarChar, 500).Value = action;

                await cmd.Connection.OpenAsync();
                await cmd.ExecuteScalarAsync();
            }
        }

        return 1;
    }
}

我尝试了以下方法来调用该方法:

Task task = Task.Run(() => logger.RecordAsynchSQL(id, lid, action))

还有:

Task task = Task.Run(async () => await logger.RecordAsynchSQL(id, lid, action));

最佳答案

您的两个选择几乎是等效的并且不必要。

调用异步方法所需要做的就是调用它,并等待返回的任务:

var task = logger.RecordAsynchSQL(id, lid, action);
var result = await task;

或者:

var result = await logger.RecordAsynchSQL(id, lid, action);

当您使用Task.Run时,您将卸载到ThreadPool线程。这会损害性能,如果没有必要,应该避免。


两个选项之间的区别在于,第一个选项使 lambda 异步并等待任务,第二个选项只是返回任务。如果您不需要该方法是异步的(例如,因为您在等待之后有一些逻辑),则不必是异步的。

关于c# - 调用异步函数的不同方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32234089/

相关文章:

c# - List<T> 真的是 C# 中的隐蔽数组吗?

.net - wpf:查找祖先的祖先

node.js - 继续循环后等待每个 promise 完成

java - 接口(interface)是否应该定义特定于实现的枚举值?

c# - 反转 .wav 文件

c# - IdentityServer4发现文档返回404

javascript - 如何在启动时使用异步存储数据渲染 React Native 组件?

C# Owin WebApp : Parsing POST Requests?

c# - 您何时使用 StringBuilder.AppendLine/string.Format 与 StringBuilder.AppendFormat?

android - Fragment异步接口(interface)回调处理