Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调用异步函数的不同方法_C#_.net_Asynchronous_Async Await_Task - Fatal编程技术网

C# 调用异步函数的不同方法

C# 调用异步函数的不同方法,c#,.net,asynchronous,async-await,task,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) {

我正在尝试创建一个可以异步写入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;
    }
}
以及:


你的两个选择几乎是等价的,没有必要

调用异步方法只需调用它,然后等待返回的任务:

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

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



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

如果您在没有
wait
的情况下调用
async
方法,它只会返回一个任务,而不是执行该方法

//This returns a task that can be consumed later
Task task = logger.RecordAsynchSQL(id, lid, action);
//This returns the integer result
int result = await logger.RecordAsynchSQL(id, lid, action);
//As you can see, you can wait for the previously created task
int result2 = await task;

作为一个旁注,考虑用“AsiNC”结束你的方法名,因为这是在.NETFramework方法

中的一个约定。请注意,所有这些机制都会丢失原始线程的上下文,即对于ASP.Net,您将无法访问
HttpContext.Current
来记录跟踪的上下文。如有可能,首选常规
等待
,如中所示
var task = logger.RecordAsynchSQL(id, lid, action);
var result = await task;
var result = await logger.RecordAsynchSQL(id, lid, action);
//This returns a task that can be consumed later
Task task = logger.RecordAsynchSQL(id, lid, action);
//This returns the integer result
int result = await logger.RecordAsynchSQL(id, lid, action);
//As you can see, you can wait for the previously created task
int result2 = await task;