ASP. NET Web API - вызвать базу данных для вставки с помощью asyn c метода, но она не работает - PullRequest
0 голосов
/ 06 марта 2020

У меня есть этот метод:

public async static Task ExecuteSpAndForget(string sp, Location location, params SqlParameter[] parameters)
{
      using (SqlConnection conn = await GetConnectionAsync(location))
      {
            SqlCommand cmd = new SqlCommand(sp, conn);
            cmd.Parameters.AddRange(parameters);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandTimeout = Int32.Parse(ConfigurationManager.AppSettings["CommandTimeout"]);

            await cmd.ExecuteNonQueryAsync().ConfigureAwait(false);
      }
}

public async static Task<SqlConnection> GetConnectionAsync(Location location)
{
    SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["ConnectionString" + location]);
    await conn.OpenAsync().ConfigureAwait(false);
    return conn;
}

И в моем фильтре журнала я применил к WebApiConfig.cs:

config.Filters.Add(new LogFilter());

И в LogFilter() я вызываю базу данных для записи log

public static int WriteLog(HttpActionContext actionContext, Exception exception = null)
{
     \\logic

var logTask = DatabaseHelper.ExecuteSpAndForget("writelogSP", Location.Log, sqlParams.ToArray());
     \\return logic
}

Когда я отлаживаю локально, это никогда не записывает в базу данных, когда я разворачиваю его в IIS, иногда оно записывает в базу данных, иногда нет. Я проверил это локально в консольном приложении: если я жду несколько секунд после вызова перед выходом, данные могут быть вставлены в базу данных, иначе вставка не происходит, если не ждать.

Почему? Как я могу использовать это?

1 Ответ

0 голосов
/ 06 марта 2020

То, на что вы ссылаетесь, является фоновой задачей.

Есть разные способы сделать это. Самый простой из них - Task.Run без ожидания

public static int WriteLog(HttpActionContext actionContext, Exception exception = null)
{
     \\logic

      // fire and forget, no await
      var logTask = Task.Run(async () =>
      {
            await DatabaseHelper.ExecuteSpAndForget("writelogSP", Location.Log, sqlParams.ToArray());         
       });

    \\return logic;

}

Вы можете проверить эту ссылку https://blog.stephencleary.com/2014/06/fire-and-forget-on-asp-net.html для лучшего решения.

...