Я пытаюсь создать класс ведения журнала, который может асинхронно писать в 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));
Если вы ищете «огнь и забыть» стиль звонков - http://stackoverflow.com/questions/12803012/fire-and-forget-with-async-vs-old-async-delegate. Обратите внимание, что все такие механизмы теряют контекст исходного потока, то есть для ASP.Net вы не сможете получить доступ к «HttpContext.Current» для регистрации контекста трассировки. Если возможно, предпочитайте регулярный 'await', как показано в [i3arnon's answer] (http://stackoverflow.com/a/32234168/477420) –